Showing preview only (422K chars total). Download the full file or copy to clipboard to get everything.
Repository: naoty/SwiftCSV
Branch: master
Commit: 324d583f2e6e
Files: 48
Total size: 403.5 KB
Directory structure:
gitextract_8pv7pl38/
├── .github/
│ └── workflows/
│ └── swift.yml
├── .gitignore
├── .spi.yml
├── .travis.yml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Configuration/
│ └── Project.xcconfig
├── LICENSE
├── Package.swift
├── README.md
├── SwiftCSV/
│ ├── CSV+DelimiterGuessing.swift
│ ├── CSV.swift
│ ├── CSVDelimiter.swift
│ ├── EnumeratedCSVView.swift
│ ├── NamedCSVView.swift
│ ├── Parser.swift
│ ├── ParsingState.swift
│ ├── Resources/
│ │ └── PrivacyInfo.xcprivacy
│ ├── Serializer.swift
│ └── String+Lines.swift
├── SwiftCSV.podspec
├── SwiftCSV.xcodeproj/
│ ├── SwiftCSV-Info.plist
│ ├── SwiftCSVTests-Info.plist
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata/
│ ├── xcbaselines/
│ │ └── 3D1E59BE1945FFAD001CF760.xcbaseline/
│ │ ├── 210222BF-FF70-4818-9C2E-20B20A9F7F48.plist
│ │ └── Info.plist
│ └── xcschemes/
│ ├── SwiftCSV-iOS.xcscheme
│ ├── SwiftCSV-macOS.xcscheme
│ ├── SwiftCSV-tvOS.xcscheme
│ └── SwiftCSV-watchOS.xcscheme
└── SwiftCSVTests/
├── CSVDelimiterGuessingTests.swift
├── CSVDelimiterTests.swift
├── EnumeratedCSVViewTests.swift
├── NamedCSVViewTests.swift
├── NewlineTests.swift
├── ParserTests.swift
├── PerformanceTest.swift
├── QuotedTests.swift
├── ResourceHelper.swift
├── TSVTests.swift
├── TestData/
│ ├── empty_fields.csv
│ ├── large.csv
│ ├── quotes.csv
│ ├── utf8_with_bom.csv
│ └── wonderland.csv
└── URLTests.swift
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/swift.yml
================================================
name: Swift
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- name: Build
run: swift build -v
- name: Run tests
run: swift test -v
================================================
FILE: .gitignore
================================================
# Created by http://www.gitignore.io
### Objective-C ###
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
.build/
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control
#
# Pods/
================================================
FILE: .spi.yml
================================================
version: 1
builder:
configs:
- documentation_targets: [SwiftCSV]
================================================
FILE: .travis.yml
================================================
language: swift
branches:
except:
- gh-pages
install:
- gem install cocoapods --pre -N
- gem install xcpretty -N
env:
global:
- LC_CTYPE=en_US.UTF-8
- LANG=en_US.UTF-8
- FRAMEWORK_NAME="SwiftCSV"
matrix:
include:
- osx_image: xcode9
env: SCHEME="macOS" SDK="macosx10.13" DESTINATION="arch=x86_64" SWIFT_VERSION="3.2" ACTION="test"
- osx_image: xcode9.3
env: SCHEME="macOS" SDK="macosx10.13" DESTINATION="arch=x86_64" SWIFT_VERSION="4.1" ACTION="test"
- osx_image: xcode10.1
env: SCHEME="macOS" SDK="macosx10.14" DESTINATION="arch=x86_64" SWIFT_VERSION="4.2" ACTION="test"
- osx_image: xcode10.2
env: SCHEME="macOS" SDK="macosx10.14" DESTINATION="arch=x86_64" SWIFT_VERSION="5.0" ACTION="test"
- osx_image: xcode10.2
env: SCHEME="iOS" SDK="iphonesimulator" DESTINATION="OS=12.0,name=iPhone 8" SWIFT_VERSION="5.0" ACTION="test"
- osx_image: xcode10.2
env: SCHEME="watchOS" SDK="watchsimulator" DESTINATION="OS=4.0,name=Apple Watch - 42mm" SWIFT_VERSION="5.0" ACTION="build"
- osx_image: xcode10.2
env: SCHEME="tvOS" SDK="appletvsimulator" DESTINATION="OS=12.0,name=Apple TV 4K" SWIFT_VERSION="5.0" ACTION="test"
script:
- set -o pipefail
- pod --version
- xcodebuild -version
- xcodebuild -showsdks
- xcodebuild
"$ACTION"
-project "$FRAMEWORK_NAME.xcodeproj"
-scheme "$FRAMEWORK_NAME-$SCHEME"
-sdk "$SDK"
-destination "$DESTINATION"
-configuration Debug
ONLY_ACTIVE_ARCH=YES
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES
GCC_GENERATE_TEST_COVERAGE_FILES=YES
SWIFT_VERSION=$SWIFT_VERSION
- pod lib lint --quick
after_success:
- bash <(curl -s https://codecov.io/bash)
================================================
FILE: CHANGELOG.md
================================================
<!--
## 0.0.0
API Changes:
Bugfixes:
Other:
-->
## Unreleased
API Changes:
- Allow `enumerateAsArray` and `enumerateAsDict` to accept a function that throws.
## 0.10.0
Other:
- Add Privacy Manifest files.
## 0.9.1
Other:
- Fix project settings.
## 0.9.0
Other:
- Fix local testing.
## 0.8.2
Bugfixes:
- Strip byte order mark from all input strings, not just when loading files (#128) -- @Diggory
## 0.8.1
Bugfixes:
- Strip byte order mark from Strings when importing so they don't become part of imported content's cells.
See #97 for discussion. (#103) -- @lardieri
- Respect alternate delimiters when serializing the CSV.
See #102 for discussion. (#107) -- @lardieri
- Escape any double-quotes embedded inside the field values when serializing the CSV.
See #111 for discussion. -- @lardieri
## 0.8.0
API Changes:
- Replace namedRows/namedColumns and enumeratedRows/enumeratedColumns with CSV<Named> and CSV<Enumerated> types
that both expose a rows/columns property with different types. This way you cannot screw up by trying to access
an unpopulated array because the CSV was loaded wrongly. The type knows it all. (#76) -- @DivineDominion
- CSV.namedRows/CSV.namedColumns and CSV.enumeratedRows/CSV.enumeratedColumns are removed.
- NamedCSV/EnumeratedCSV type aliases are introduced to simplify access.
## 0.7.1
Bugfixes:
- Backport of fix from 0.8.1 to 0.7.x: Strip byte order mark from Strings when importing so they don't become part of imported content's cells.
See #97 for discussion. (#104) -- @lardieri
## 0.7.0
API Changes:
- Introduce delimiter guessing (#100) - @DivineDominion
## 0.6.1
Bugfixes:
- Fix enumeration limit being ignored in `Parser` (#98) - @jasonmedeiros
## 0.6.0
API Changes:
- Rename `View` to `CSVView` to avoid SwiftUI namespace conflicts (#93) - @campionfellin
Other:
- Bump iOS Deployment target to 9.0, Xcode 12 recommended changes. (#91) - @DenTelezhkin
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to SwiftCSV
Pull requests are welcome on the [`master`](https://github.com/swiftcsv/SwiftCSV) branch.
We know making you first pull request can be scary. If you have trouble with any of the contribution rules, **still make the Pull Request**. We are here to help.
We personally think the best way to get started contributing to this library is by using it in one of your projects!
## Swift style guide
We follow the [Ray Wenderlich Style Guide](https://github.com/raywenderlich/swift-style-guide) very closely with the following exception:
- Use the Xcode default of 4 spaces for indentation.
## SwiftLint
[SwiftLint](https://github.com/realm/SwiftLint) will run automatically on all pull requests via [houndci.com](https://houndci.com/). If you have SwiftLint installed, you will receive the same warnings in Xcode at build time, that hound will check for on pull requests.
Function body lengths in tests will often cause a SwiftLint warning. These can be handled on a per case bases by prefixing the function with:
```swift
// swiftlint:disable function_body_length
func someFunctionThatShouldHaveAReallyLongBody() {}
```
Common violations to look out for are trailing white and valid docs.
## Tests
All code going into master requires testing. We strive for code coverage of 100% to ensure the best possibility that all edge cases are tested for. It's good practice to test for any variations that can cause nil to be returned.
Tests are run in [Travis CI](https://travis-ci.org/swiftcsv/SwiftCSV) automatically on all pull requests, branches and tags. These are the same tests that run in Xcode at development time.
## Comments
- **Readable code should be preferred over commented code.**
Comments in code are used to document non-obvious use cases. For example, when the use of a piece of code looks unnecessary, and naming alone does not convey why it is required.
- **Comments need to be updated or removed if the code changes.**
If a comment is included, it is just as important as code and has the same technical debt weight. The only thing worse than a unneeded comment is a comment that is not maintained.
## Code documentation
Code documentation is different from comments. Please be liberal with code docs.
When writing code docs, remember they are:
- Displayed to a user in Xcode quick help
- Used to generate API documentation
- API documentation also generates Dash docsets
In particular paying attention to:
- Keeping docs current
- Documenting all parameters and return types (SwiftLint helps with warning when they are not valid)
- Stating common issues that a user may run into
See [NSHipster Swift Documentation](http://nshipster.com/swift-documentation/) for a good reference on writing documentation in Swift.
## Pull Request Technicalities
You're always welcome to open Pull Requests, even if the result is not quite finished or you need feedback!
Here's a checklist for you about what makes Pull Requests to SwiftCSV shine:
* Run [SwiftLint](https://github.com/realm/SwiftLint) locally to ensure your code-style is consistent with the rest of the codebase.
* Keep your Pull Requests focused. Rather be opening multiple PRs than making a dozen unrelated but discussion worthy changes in a single PR.
* You can propose PRs to merge with the `master` branch directly. We don't use any complex branching strategies.
**As a contributor,** choose the "squash & merge" strategy to merge PRs with a single commit, keeping the commit history clean. (That's an upside of focused Pull Requests: you don't lose extra information.)
## Publishing New Releases
Members of the [@SwiftCSV/releases](https://github.com/orgs/swiftcsv/teams/releases) team have the necessary permissions to publish a new version to CocoaPods. If you want a new version of SwiftCSV to be published you should ping these folks.
To create a new release, create a pull request targeting either `master`, or a separate release branch for hot-fixes, with the following:
- [ ] Bump version number in `SwiftCSV.podspec` and `Info.plist` (We follow [semver](https://semver.org/) - most importantly any breaking API change should result in a major API version bump)
- [ ] Create a tag off of the relevant branch (`master` for regular release) and add relevant changelog entries to the [release list on GitHub](https://github.com/swiftcsv/SwiftCSV/releases)
- [ ] Publish the new version to the CocoaPods trunk via `pod trunk push`
================================================
FILE: Configuration/Project.xcconfig
================================================
MARKETING_VERSION=0.10.0
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2014 Naoto Kaneko.
Copyright (c) 2019 SwiftCSV Contributors.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: Package.swift
================================================
// swift-tools-version: 5.6
import PackageDescription
let package = Package(
name: "SwiftCSV",
platforms: [
.macOS("10.13"), .iOS("12.0"), .tvOS("12.0"), .watchOS("4.0")
],
products: [
.library(
name: "SwiftCSV",
targets: ["SwiftCSV"]),
],
dependencies: [], // No dependencies
targets: [
.target(
name: "SwiftCSV",
dependencies: [],
path: "SwiftCSV",
resources: [
.process("Resources/PrivacyInfo.xcprivacy"),
]),
.testTarget(
name: "SwiftCSVTests",
dependencies: ["SwiftCSV"],
path: "SwiftCSVTests",
resources: [
.copy("TestData"),
]),
],
swiftLanguageVersions: [.v5, .v4_2]
)
================================================
FILE: README.md
================================================
# SwiftCSV
[](https://github.com/swiftcsv/SwiftCSV/blob/master/LICENSE.md)
[](https://travis-ci.org/swiftcsv/SwiftCSV)
[](https://codecov.io/gh/swiftcsv/SwiftCSV)
[](https://cocoapods.org/pods/SwiftCSV)
[](https://github.com/Carthage/Carthage)
[](https://github.com/swiftcsv/SwiftCSV/blob/master/LICENSE.md)
[](https://swiftpackageindex.com/swiftcsv/SwiftCSV)
[](https://swiftpackageindex.com/swiftcsv/SwiftCSV)
Simple CSV parsing for macOS, iOS, tvOS, and watchOS.
## Usage
CSV content can be loaded using the `CSV` class:
```swift
import SwiftCSV
do {
// As a string, guessing the delimiter
let csv: CSV = try CSV<Named>(string: "id,name,age\n1,Alice,18")
// Specifying a custom delimiter
let tsv: CSV = try CSV<Enumerated>(string: "id\tname\tage\n1\tAlice\t18", delimiter: .tab)
// From a file (propagating error during file loading)
let csvFile: CSV = try CSV<Named>(url: URL(fileURLWithPath: "path/to/users.csv"))
// From a file inside the app bundle, with a custom delimiter, errors, and custom encoding.
// Note the result is an optional.
let resource: CSV? = try CSV<Named>(
name: "users",
extension: "tsv",
bundle: .main,
delimiter: .character("🐠"), // Any character works!
encoding: .utf8)
} catch parseError as CSVParseError {
// Catch errors from parsing invalid CSV
} catch {
// Catch errors from trying to load files
}
```
### File Loading
The `CSV` class comes with initializers that are suited for loading files from URLs.
```swift
extension CSV {
/// Load a CSV file from `url`.
///
/// - Parameters:
/// - url: URL of the file (will be passed to `String(contentsOfURL:encoding:)` to load)
/// - delimiter: Character used to separate separate cells from one another in rows.
/// - encoding: Character encoding to read file (default is `.utf8`)
/// - loadColumns: Whether to populate the columns dictionary (default is `true`)
/// - Throws: `CSVParseError` when parsing the contents of `url` fails, or file loading errors.
public convenience init(url: URL,
delimiter: CSVDelimiter,
encoding: String.Encoding = .utf8,
loadColumns: Bool = true) throws
/// Load a CSV file from `url` and guess its delimiter from `CSV.recognizedDelimiters`, falling back to `.comma`.
///
/// - Parameters:
/// - url: URL of the file (will be passed to `String(contentsOfURL:encoding:)` to load)
/// - encoding: Character encoding to read file (default is `.utf8`)
/// - loadColumns: Whether to populate the columns dictionary (default is `true`)
/// - Throws: `CSVParseError` when parsing the contents of `url` fails, or file loading errors.
public convenience init(url: URL,
encoding: String.Encoding = .utf8,
loadColumns: Bool = true)
}
```
### Delimiters
Delimiters are strongly typed. The recognized `CSVDelimiter` cases are: `.comma`, `.semicolon`, and `.tab`.
You can use convenience initializers that guess the delimiter from the recognized list for you. These initializers are available for loading CSV from URLs and strings.
You can also use any other single-character delimiter when loading CSV data. A character literal like `"x"` will produce `CSV.Delimiter.character("x")`, so you don't have to type the whole `.character(_)` case name. There are initializers for each variant that accept explicit delimiter settings.
### Reading Data
```swift
// Recognized the comma delimiter automatically:
let csv = CSV<Named>(string: "id,name,age\n1,Alice,18\n2,Bob,19")
csv.header //=> ["id", "name", "age"]
csv.rows //=> [["id": "1", "name": "Alice", "age": "18"], ["id": "2", "name": "Bob", "age": "19"]]
csv.columns //=> ["id": ["1", "2"], "name": ["Alice", "Bob"], "age": ["18", "19"]]
```
The rows can also be parsed and passed to a block on the fly, reducing the memory needed to store the whole lot in an array:
```swift
// Access each row as an array (inner array not guaranteed to always be equal length to the header)
csv.enumerateAsArray { array in
print(array.first)
}
// Access them as a dictionary
csv.enumerateAsDict { dict in
print(dict["name"])
}
```
### Skip Named Column Access for Large Data Sets
Use `CSV<Named>` aka `NamedCSV` to access the CSV data on a column-by-column basis with named columns. Think of this like a cross section:
```swift
let csv = NamedCSV(string: "id,name,age\n1,Alice,18\n2,Bob,19")
csv.rows[0]["name"] //=> "Alice"
csv.columns["name"] //=> ["Alice", "Bob"]
```
If you only want to access your data row-by-row, and not by-column, then you can use `CSV<Enumerated>` or `EnumeratedCSV`:
```swift
let csv = EnumeratedCSV(string: "id,name,age\n1,Alice,18\n2,Bob,19")
csv.rows[0][1] //=> "Alice"
csv.columns?[0].header //=> "name"
csv.columns?[0].rows //=> ["Alice", "Bob"]
```
To speed things up, skip populating by-column access completely by passing `loadColumns: false`. This will prevent the columnar data from being populated. For large data sets, this saves a lot of iterations (at quadratic runtime).
```swift
let csv = EnumeratedCSV(string: "id,name,age\n1,Alice,18\n2,Bob,19", loadColumns: false)
csv.rows[0][1] //=> "Alice"
csv.columns //=> nil
```
## Installation
### CocoaPods
```ruby
pod "SwiftCSV"
```
### Carthage
```
github "swiftcsv/SwiftCSV"
```
### SwiftPM
```
.package(url: "https://github.com/swiftcsv/SwiftCSV.git", from: "0.8.0")
```
## Privacy Manifest
The package ships with an empty Privacy Manifest because it doesn't access or track any sensitive data.
================================================
FILE: SwiftCSV/CSV+DelimiterGuessing.swift
================================================
//
// CSV+DelimiterGuessing.swift
// SwiftCSV
//
// Created by Christian Tietze on 21.12.21.
// Copyright © 2021 SwiftCSV. All rights reserved.
//
import Foundation
extension CSVDelimiter {
public static let recognized: [CSVDelimiter] = [.comma, .tab, .semicolon]
/// - Returns: Delimiter between cells based on the first line in the CSV. Falls back to `.comma`.
public static func guessed(string: String) -> CSVDelimiter {
let recognizedDelimiterCharacters = CSVDelimiter.recognized.map(\.rawValue)
// Trim newline and spaces, but keep tabs (as delimiters)
var trimmedCharacters = CharacterSet.whitespacesAndNewlines
trimmedCharacters.remove("\t")
let line = string.trimmingCharacters(in: trimmedCharacters).firstLine
var index = line.startIndex
while index < line.endIndex {
let character = line[index]
switch character {
case "\"":
// When encountering an open quote, skip to the closing counterpart.
// If none is found, skip to end of line.
// 1) Advance one character to skip the quote
index = line.index(after: index)
// 2) Look for the closing quote and move current position after it
if index < line.endIndex,
let closingQuoteInddex = line[index...].firstIndex(of: character) {
index = line.index(after: closingQuoteInddex)
} else {
index = line.endIndex
}
case _ where recognizedDelimiterCharacters.contains(character):
return CSVDelimiter(rawValue: character)
default:
index = line.index(after: index)
}
}
// Fallback value
return .comma
}
}
================================================
FILE: SwiftCSV/CSV.swift
================================================
//
// CSV.swift
// SwiftCSV
//
// Created by Naoto Kaneko on 2/18/16.
// Copyright © 2016 Naoto Kaneko. All rights reserved.
//
import Foundation
/// Byte Order Mark from the Unicode Standard
///
/// Some CSV files encoded in UTF-8, such as those generated by Excel and Airtable, include a BOM to distinguish them from older CSV files written using ASCII or other legacy encodings. This behavior is explicitly permitted, but not required, by the Unicode Standard.
///
/// The BOM is not part of the CSV string itself; it is only a header on the file that stores the string.
///
/// - Attention: The convenience initializer
/// ```String(contentsOf:encoding:)```
/// correctly removes the BOM when decoding `.utf16` or `.utf32` files,
/// but incorrectly includes the BOM in the returned string when decoding `.utf8` files.
/// This means the caller must look for and strip the BOM explicitly from the returned string.
///
/// See also:
///
/// [Unicode FAQ](https://unicode.org/faq/utf_bom.html#BOM)
///
/// [Unicode Standard, section 2.13](https://www.unicode.org/versions/Unicode14.0.0/ch02.pdf#G9354)
///
fileprivate let byteOrderMark = "\u{FEFF}"
public protocol CSVView {
associatedtype Row
associatedtype Columns
var rows: [Row] { get }
/// Is `nil` if `loadColumns` was set to `false`.
var columns: Columns? { get }
init(header: [String], text: String, delimiter: CSVDelimiter, loadColumns: Bool, rowLimit: Int?) throws
func serialize(header: [String], delimiter: CSVDelimiter) -> String
}
/// CSV variant for which unique column names are assumed.
///
/// Example:
///
/// let csv = NamedCSV(...)
/// let allIDs = csv.columns["id"]
/// let firstEntry = csv.rows[0]
/// let fullName = firstEntry["firstName"] + " " + firstEntry["lastName"]
///
public typealias NamedCSV = CSV<Named>
/// CSV variant that exposes columns and rows as arrays.
/// Example:
///
/// let csv = EnumeratedCSV(...)
/// let allIds = csv.columns.filter { $0.header == "id" }.rows
///
public typealias EnumeratedCSV = CSV<Enumerated>
/// For convenience, there's `EnumeratedCSV` to access fields in rows by their column index,
/// and `NamedCSV` to access fields by their column names as defined in a header row.
open class CSV<DataView : CSVView> {
public let header: [String]
/// Unparsed contents.
public let text: String
/// Used delimiter to parse `text` and to serialize the data again.
public let delimiter: CSVDelimiter
/// Underlying data representation of the CSV contents.
public let content: DataView
public var rows: [DataView.Row] {
return content.rows
}
/// Is `nil` if `loadColumns` was set to `false` during initialization.
public var columns: DataView.Columns? {
return content.columns
}
/// Load CSV data from a string.
///
/// - Parameters:
/// - string: CSV contents to parse.
/// - delimiter: Character used to separate cells from one another in rows.
/// - loadColumns: Whether to populate the `columns` dictionary (default is `true`)
/// - rowLimit: Amount of rows to parse (default is `nil`).
/// - Throws: `CSVParseError` when parsing `string` fails.
public init(string: String, delimiter: CSVDelimiter, loadColumns: Bool = true, rowLimit: Int? = nil) throws {
if string.hasPrefix(byteOrderMark) {
let trimmedString = string.dropFirst()
self.text = String(trimmedString)
} else {
self.text = string
}
self.delimiter = delimiter
self.header = try Parser.array(text: self.text, delimiter: delimiter, rowLimit: 1).first ?? []
self.content = try DataView(header: header, text: self.text, delimiter: delimiter, loadColumns: loadColumns, rowLimit: rowLimit)
}
/// Load CSV data from a string and guess its delimiter from `CSV.recognizedDelimiters`, falling back to `.comma`.
///
/// - parameter string: CSV contents to parse.
/// - parameter loadColumns: Whether to populate the `columns` dictionary (default is `true`)
/// - throws: `CSVParseError` when parsing `string` fails.
public convenience init(string: String, loadColumns: Bool = true) throws {
let delimiter = CSVDelimiter.guessed(string: string)
try self.init(string: string, delimiter: delimiter, loadColumns: loadColumns)
}
/// Turn the CSV data into NSData using a given encoding
open func dataUsingEncoding(_ encoding: String.Encoding) -> Data? {
return serialized.data(using: encoding)
}
/// Serialized form of the CSV data; depending on the View used, this may
/// perform additional normalizations.
open var serialized: String {
return self.content.serialize(header: self.header, delimiter: self.delimiter)
}
}
extension CSV: CustomStringConvertible {
public var description: String {
return self.serialized
}
}
extension CSV {
/// Load a CSV file from `url`.
///
/// - Parameters:
/// - url: URL of the file (will be passed to `String(contentsOfURL:encoding:)` to load)
/// - delimiter: Character used to separate separate cells from one another in rows.
/// - encoding: Character encoding to read file (default is `.utf8`)
/// - loadColumns: Whether to populate the columns dictionary (default is `true`)
/// - Throws: `CSVParseError` when parsing the contents of `url` fails, or file loading errors.
public convenience init(url: URL, delimiter: CSVDelimiter, encoding: String.Encoding = .utf8, loadColumns: Bool = true) throws {
let contents = try String(contentsOf: url, encoding: encoding)
try self.init(string: contents, delimiter: delimiter, loadColumns: loadColumns)
}
/// Load a CSV file from `url` and guess its delimiter from `CSV.recognizedDelimiters`, falling back to `.comma`.
///
/// - Parameters:
/// - url: URL of the file (will be passed to `String(contentsOfURL:encoding:)` to load)
/// - encoding: Character encoding to read file (default is `.utf8`)
/// - loadColumns: Whether to populate the columns dictionary (default is `true`)
/// - Throws: `CSVParseError` when parsing the contents of `url` fails, or file loading errors.
public convenience init(url: URL, encoding: String.Encoding = .utf8, loadColumns: Bool = true) throws {
let contents = try String(contentsOf: url, encoding: encoding)
try self.init(string: contents, loadColumns: loadColumns)
}
}
extension CSV {
/// Load a CSV file as a named resource from `bundle`.
///
/// - Parameters:
/// - name: Name of the file resource inside `bundle`.
/// - ext: File extension of the resource; use `nil` to load the first file matching the name (default is `nil`)
/// - bundle: `Bundle` to use for resource lookup (default is `.main`)
/// - delimiter: Character used to separate separate cells from one another in rows.
/// - encoding: encoding used to read file (default is `.utf8`)
/// - loadColumns: Whether to populate the columns dictionary (default is `true`)
/// - Throws: `CSVParseError` when parsing the contents of the resource fails, or file loading errors.
/// - Returns: `nil` if the resource could not be found
public convenience init?(name: String, extension ext: String? = nil, bundle: Bundle = .main, delimiter: CSVDelimiter, encoding: String.Encoding = .utf8, loadColumns: Bool = true) throws {
guard let url = bundle.url(forResource: name, withExtension: ext) else {
return nil
}
try self.init(url: url, delimiter: delimiter, encoding: encoding, loadColumns: loadColumns)
}
/// Load a CSV file as a named resource from `bundle` and guess its delimiter from `CSV.recognizedDelimiters`, falling back to `.comma`.
///
/// - Parameters:
/// - name: Name of the file resource inside `bundle`.
/// - ext: File extension of the resource; use `nil` to load the first file matching the name (default is `nil`)
/// - bundle: `Bundle` to use for resource lookup (default is `.main`)
/// - encoding: encoding used to read file (default is `.utf8`)
/// - loadColumns: Whether to populate the columns dictionary (default is `true`)
/// - Throws: `CSVParseError` when parsing the contents of the resource fails, or file loading errors.
/// - Returns: `nil` if the resource could not be found
public convenience init?(name: String, extension ext: String? = nil, bundle: Bundle = .main, encoding: String.Encoding = .utf8, loadColumns: Bool = true) throws {
guard let url = bundle.url(forResource: name, withExtension: ext) else {
return nil
}
try self.init(url: url, encoding: encoding, loadColumns: loadColumns)
}
}
================================================
FILE: SwiftCSV/CSVDelimiter.swift
================================================
//
// CSVDelimiter.swift
// SwiftCSV
//
// Created by Christian Tietze on 01.07.22.
// Copyright © 2022 SwiftCSV. All rights reserved.
//
public enum CSVDelimiter: Equatable, ExpressibleByUnicodeScalarLiteral {
public typealias UnicodeScalarLiteralType = Character
case comma, semicolon, tab
case character(Character)
public init(unicodeScalarLiteral: Character) {
self.init(rawValue: unicodeScalarLiteral)
}
init(rawValue: Character) {
switch rawValue {
case ",": self = .comma
case ";": self = .semicolon
case "\t": self = .tab
default: self = .character(rawValue)
}
}
public var rawValue: Character {
switch self {
case .comma: return ","
case .semicolon: return ";"
case .tab: return "\t"
case .character(let character): return character
}
}
}
================================================
FILE: SwiftCSV/EnumeratedCSVView.swift
================================================
//
// EnumeratedCSVView.swift
// SwiftCSV
//
// Created by Christian Tietze on 25/10/16.
// Copyright © 2016 Naoto Kaneko. All rights reserved.
//
import Foundation
public struct Enumerated: CSVView {
public struct Column: Equatable {
public let header: String
public let rows: [String]
}
public typealias Row = [String]
public typealias Columns = [Column]
public private(set) var rows: [Row]
public private(set) var columns: Columns?
public init(header: [String], text: String, delimiter: CSVDelimiter, loadColumns: Bool = false, rowLimit: Int? = nil) throws {
self.rows = try {
var rows: [Row] = []
try Parser.enumerateAsArray(text: text, delimiter: delimiter, startAt: 1, rowLimit: rowLimit) { fields in
rows.append(fields)
}
// Fill in gaps at the end of rows that are too short.
return makingRectangular(rows: rows)
}()
self.columns = {
guard loadColumns else { return nil }
return header.enumerated().map { (index: Int, header: String) -> Column in
return Column(
header: header,
rows: rows.map { $0[safe: index] ?? "" })
}
}()
}
public func serialize(header: [String], delimiter: CSVDelimiter) -> String {
return Serializer.serialize(header: header, rows: rows, delimiter: delimiter)
}
}
extension Collection {
subscript (safe index: Self.Index) -> Self.Iterator.Element? {
return index < endIndex ? self[index] : nil
}
}
fileprivate func makingRectangular(rows: [[String]]) -> [[String]] {
let cellsPerRow = rows.map { $0.count }.max() ?? 0
return rows.map { row -> [String] in
let missingCellCount = cellsPerRow - row.count
let appendix = Array(repeating: "", count: missingCellCount)
return row + appendix
}
}
================================================
FILE: SwiftCSV/NamedCSVView.swift
================================================
//
// NamedCSVView.swift
// SwiftCSV
//
// Created by Christian Tietze on 22/10/16.
// Copyright © 2016 Naoto Kaneko. All rights reserved.
//
public struct Named: CSVView {
public typealias Row = [String : String]
public typealias Columns = [String : [String]]
public var rows: [Row]
public var columns: Columns?
public init(header: [String], text: String, delimiter: CSVDelimiter, loadColumns: Bool = false, rowLimit: Int? = nil) throws {
self.rows = try {
var rows: [Row] = []
try Parser.enumerateAsDict(header: header, content: text, delimiter: delimiter, rowLimit: rowLimit) { dict in
rows.append(dict)
}
return rows
}()
self.columns = {
guard loadColumns else { return nil }
var columns: Columns = [:]
for field in header {
columns[field] = rows.map { $0[field] ?? "" }
}
return columns
}()
}
public func serialize(header: [String], delimiter: CSVDelimiter) -> String {
let rowsOrderingCellsByHeader = rows.map { row in
header.map { cellID in row[cellID]! }
}
return Serializer.serialize(header: header, rows: rowsOrderingCellsByHeader, delimiter: delimiter)
}
}
================================================
FILE: SwiftCSV/Parser.swift
================================================
//
// Parser.swift
// SwiftCSV
//
// Created by Will Richardson on 13/04/16.
// Copyright © 2016 Naoto Kaneko. All rights reserved.
//
extension CSV {
/// Parse the file and call a block on each row, passing it in as a list of fields.
/// - Parameters limitTo: Maximum absolute line number in the content, *not* maximum amount of rows.
@available(*, deprecated, message: "Use enumerateAsArray(startAt:rowLimit:_:) instead")
public func enumerateAsArray(limitTo maxRow: Int? = nil, startAt: Int = 0, _ rowCallback: @escaping ([String]) -> ()) throws {
try Parser.enumerateAsArray(text: self.text, delimiter: self.delimiter, startAt: startAt, rowLimit: maxRow.map { $0 - startAt }, rowCallback: rowCallback)
}
/// Parse the CSV contents row by row from `start` for `rowLimit` amount of rows, or until the end of the input.
/// - Parameters:
/// - startAt: Skip lines before this. Default value is `0` to start at the beginning.
/// - rowLimit: Amount of rows to consume, beginning to count at `startAt`. Default value is `nil` to consume
/// the whole input string.
/// - rowCallback: Array of each row's columnar values, in order.
/// - Throws: `CSVParseError` or any error thrown by `rowCallback`
///
public func enumerateAsArray(startAt: Int = 0, rowLimit: Int? = nil, _ rowCallback: @escaping ([String]) throws -> ()) throws {
try Parser.enumerateAsArray(text: self.text, delimiter: self.delimiter, startAt: startAt, rowLimit: rowLimit, rowCallback: rowCallback)
}
public func enumerateAsDict(_ block: @escaping ([String : String]) throws -> ()) throws {
try Parser.enumerateAsDict(header: self.header, content: self.text, delimiter: self.delimiter, block: block)
}
}
enum Parser {
static func array(text: String, delimiter: CSVDelimiter, startAt offset: Int = 0, rowLimit: Int? = nil) throws -> [[String]] {
var rows = [[String]]()
try enumerateAsArray(text: text, delimiter: delimiter, startAt: offset, rowLimit: rowLimit) { row in
rows.append(row)
}
return rows
}
/// Parse `text` and provide each row to `rowCallback` as an array of field values, one for each column per
/// line of text, separated by `delimiter`.
///
/// - Parameters:
/// - text: Text to parse.
/// - delimiter: Character to split row and header fields by (default is ',')
/// - offset: Skip lines before this. Default value is `0` to start at the beginning.
/// - rowLimit: Amount of rows to consume, beginning to count at `startAt`. Default value is `nil` to consume
/// the whole input string.
/// - rowCallback: Callback invoked for every parsed row between `startAt` and `limitTo` in `text`.
/// - Throws: `CSVParseError` or any error thrown by `rowCallback`
static func enumerateAsArray(text: String,
delimiter: CSVDelimiter,
startAt offset: Int = 0,
rowLimit: Int? = nil,
rowCallback: @escaping ([String]) throws -> ()) throws {
let maxRowIndex = rowLimit.flatMap { $0 < 0 ? nil : offset + $0 }
var currentIndex = text.startIndex
let endIndex = text.endIndex
var fields = [String]()
let delimiter = delimiter.rawValue
var field = ""
var rowIndex = 0
func finishRow() throws {
defer {
rowIndex += 1
fields = []
field = ""
}
guard rowIndex >= offset else { return }
fields.append(String(field))
try rowCallback(fields)
}
var state: ParsingState = ParsingState(
delimiter: delimiter,
finishRow: finishRow,
appendChar: {
guard rowIndex >= offset else { return }
field.append($0)
},
finishField: {
guard rowIndex >= offset else { return }
fields.append(field)
field = ""
})
func limitReached(_ rowNumber: Int) -> Bool {
guard let maxRowIndex = maxRowIndex else { return false }
return rowNumber >= maxRowIndex
}
while currentIndex < endIndex,
!limitReached(rowIndex) {
let char = text[currentIndex]
try state.change(char)
currentIndex = text.index(after: currentIndex)
}
// Append remainder of the cache, unless we're past the limit already.
if !limitReached(rowIndex) {
if !field.isEmpty {
fields.append(field)
}
if !fields.isEmpty {
try rowCallback(fields)
}
}
}
static func enumerateAsDict(header: [String], content: String, delimiter: CSVDelimiter, rowLimit: Int? = nil, block: @escaping ([String : String]) throws -> ()) throws {
let enumeratedHeader = header.enumerated()
// Start after the header
try enumerateAsArray(text: content, delimiter: delimiter, startAt: 1, rowLimit: rowLimit) { fields in
var dict = [String: String]()
for (index, head) in enumeratedHeader {
dict[head] = index < fields.count ? fields[index] : ""
}
try block(dict)
}
}
}
================================================
FILE: SwiftCSV/ParsingState.swift
================================================
//
// ParsingState.swift
// SwiftCSV
//
// Created by Christian Tietze on 25/10/16.
// Copyright © 2016 Naoto Kaneko. All rights reserved.
//
public enum CSVParseError: Error {
case generic(message: String)
case quotation(message: String)
}
/// State machine of parsing CSV contents character by character.
struct ParsingState {
private(set) var atStart = true
private(set) var parsingField = false
private(set) var parsingQuotes = false
private(set) var innerQuotes = false
let delimiter: Character
let finishRow: () throws -> Void
let appendChar: (Character) throws -> Void
let finishField: () throws -> Void
init(delimiter: Character,
finishRow: @escaping () throws -> Void,
appendChar: @escaping (Character) throws -> Void,
finishField: @escaping () throws -> Void) {
self.delimiter = delimiter
self.finishRow = finishRow
self.appendChar = appendChar
self.finishField = finishField
}
/// - Throws: `CSVParseError`
mutating func change(_ char: Character) throws {
if atStart {
if char == "\"" {
atStart = false
parsingQuotes = true
} else if char == delimiter {
try finishField()
} else if char.isNewline {
try finishRow()
} else if char.isWhitespace {
// ignore whitespaces between fields
} else {
parsingField = true
atStart = false
try appendChar(char)
}
} else if parsingField {
if innerQuotes {
if char == "\"" {
try appendChar(char)
innerQuotes = false
} else {
throw CSVParseError.quotation(message: "Can't have non-quote here: \(char)")
}
} else {
if char == "\"" {
innerQuotes = true
} else if char == delimiter {
atStart = true
parsingField = false
innerQuotes = false
try finishField()
} else if char.isNewline {
atStart = true
parsingField = false
innerQuotes = false
try finishRow()
} else {
try appendChar(char)
}
}
} else if parsingQuotes {
if innerQuotes {
if char == "\"" {
try appendChar(char)
innerQuotes = false
} else if char == delimiter {
atStart = true
parsingField = false
innerQuotes = false
try finishField()
} else if char.isNewline {
atStart = true
parsingQuotes = false
innerQuotes = false
try finishRow()
} else if char.isWhitespace {
// ignore whitespaces between fields
} else {
throw CSVParseError.quotation(message: "Can't have non-quote here: \(char)")
}
} else {
if char == "\"" {
innerQuotes = true
} else {
try appendChar(char)
}
}
} else {
throw CSVParseError.generic(message: "me_irl")
}
}
}
================================================
FILE: SwiftCSV/Resources/PrivacyInfo.xcprivacy
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array/>
</dict>
</plist>
================================================
FILE: SwiftCSV/Serializer.swift
================================================
//
// Serializer.swift
// SwiftCSV
//
import Foundation
enum Serializer {
static let newline = "\n"
static func serialize(header: [String], rows: [[String]], delimiter: CSVDelimiter) -> String {
let head = serializeRow(row: header, delimiter: delimiter) + newline
let content = rows.map { row in
serializeRow(row: row, delimiter: delimiter)
}.joined(separator: newline)
return head + content
}
static func serializeRow(row: [String], delimiter: CSVDelimiter) -> String {
let separator = String(delimiter.rawValue)
let content = row.map { cell in
cell.enquoted(whenContaining: separator)
}.joined(separator: separator)
return content
}
}
fileprivate extension String {
static let quote = "\""
func enquoted(whenContaining separator: String) -> String {
// If value contains a delimiter or quotes, double any embedded quotes and surround with quotes.
// For more information, see https://www.rfc-editor.org/rfc/rfc4180.html
if self.contains(separator) || self.contains(Self.quote) {
return Self.quote + self.replacingOccurrences(of: Self.quote, with: Self.quote + Self.quote) + Self.quote
} else {
return self
}
}
}
================================================
FILE: SwiftCSV/String+Lines.swift
================================================
//
// String+Lines.swift
// SwiftCSV
//
// Created by Naoto Kaneko on 2/24/16.
// Copyright © 2016 Naoto Kaneko. All rights reserved.
//
extension String {
internal var firstLine: String {
var current = startIndex
while current < endIndex && self[current].isNewline == false {
current = self.index(after: current)
}
return String(self[..<current])
}
}
extension Character {
internal var isNewline: Bool {
return self == "\n"
|| self == "\r\n"
|| self == "\r"
}
}
================================================
FILE: SwiftCSV.podspec
================================================
Pod::Spec.new do |s|
s.name = "SwiftCSV"
s.version = "0.10.0"
s.summary = "CSV parser for Swift"
s.homepage = "https://github.com/swiftcsv/SwiftCSV"
s.license = { :type => "MIT", :file => "LICENSE" }
s.author = {
"Naoto Kaneko" => "naoty.k@gmail.com",
"Christian Tietze" => "me@christiantietze.de"
}
s.source = { :git => "https://github.com/swiftcsv/SwiftCSV.git", :tag => s.version }
s.swift_versions = [ "5.10", "5.9", "5.8", "5.7", "5.6", "5.5", "5.4", "5.3", "5.2", "5.1", "5.0", "4.2" ]
s.ios.deployment_target = "12.0"
s.osx.deployment_target = "10.13"
s.tvos.deployment_target = "12.0"
s.watchos.deployment_target = "4.0"
s.source_files = "SwiftCSV/**/*.swift"
s.resource_bundles = {'SwiftCSV' => ['SwiftCSV/Resources/*.xcprivacy']}
s.requires_arc = true
end
================================================
FILE: SwiftCSV.xcodeproj/SwiftCSV-Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${CURRENT_PROJECT_VERSION}</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>
================================================
FILE: SwiftCSV.xcodeproj/SwiftCSVTests-Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>
================================================
FILE: SwiftCSV.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
3D1E59C01945FFAD001CF760 /* SwiftCSV.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D1E59B41945FFAC001CF760 /* SwiftCSV.framework */; };
3D1E59C71945FFAD001CF760 /* NamedCSVViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D1E59C61945FFAD001CF760 /* NamedCSVViewTests.swift */; };
3D3749E3194D6DF7008F262A /* TSVTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3749E2194D6DF7008F262A /* TSVTests.swift */; };
3D444BCD1C7D88290001C60C /* String+Lines.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D444BCC1C7D88290001C60C /* String+Lines.swift */; };
3DAAEE9C1C74C7EC00A933DB /* CSV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DAAEE9B1C74C7EC00A933DB /* CSV.swift */; };
5015AD8A274BA20A0050F975 /* ParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5015AD89274BA20A0050F975 /* ParserTests.swift */; };
5015AD8B274BA20A0050F975 /* ParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5015AD89274BA20A0050F975 /* ParserTests.swift */; };
5015AD8C274BA20A0050F975 /* ParserTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5015AD89274BA20A0050F975 /* ParserTests.swift */; };
502CDAF42AC60ADA00766701 /* ResourceHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502CDAF32AC60ADA00766701 /* ResourceHelper.swift */; };
502CDAF52AC60ADA00766701 /* ResourceHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502CDAF32AC60ADA00766701 /* ResourceHelper.swift */; };
502CDAF62AC60ADA00766701 /* ResourceHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502CDAF32AC60ADA00766701 /* ResourceHelper.swift */; };
508975D21DBB897A006F3DBE /* NamedCSVView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508975D11DBB897A006F3DBE /* NamedCSVView.swift */; };
508975D31DBB897A006F3DBE /* NamedCSVView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508975D11DBB897A006F3DBE /* NamedCSVView.swift */; };
508975D41DBB897A006F3DBE /* NamedCSVView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508975D11DBB897A006F3DBE /* NamedCSVView.swift */; };
508975D51DBB897A006F3DBE /* NamedCSVView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508975D11DBB897A006F3DBE /* NamedCSVView.swift */; };
508975D71DBF34CF006F3DBE /* ParsingState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508975D61DBF34CF006F3DBE /* ParsingState.swift */; };
508975D81DBF34CF006F3DBE /* ParsingState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508975D61DBF34CF006F3DBE /* ParsingState.swift */; };
508975D91DBF34CF006F3DBE /* ParsingState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508975D61DBF34CF006F3DBE /* ParsingState.swift */; };
508975DA1DBF34CF006F3DBE /* ParsingState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508975D61DBF34CF006F3DBE /* ParsingState.swift */; };
508975DC1DBF3B70006F3DBE /* EnumeratedCSVView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508975DB1DBF3B70006F3DBE /* EnumeratedCSVView.swift */; };
508975DD1DBF3B70006F3DBE /* EnumeratedCSVView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508975DB1DBF3B70006F3DBE /* EnumeratedCSVView.swift */; };
508975DE1DBF3B70006F3DBE /* EnumeratedCSVView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508975DB1DBF3B70006F3DBE /* EnumeratedCSVView.swift */; };
508975DF1DBF3B70006F3DBE /* EnumeratedCSVView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508975DB1DBF3B70006F3DBE /* EnumeratedCSVView.swift */; };
508975E11DBF3E51006F3DBE /* EnumeratedCSVViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508975E01DBF3E51006F3DBE /* EnumeratedCSVViewTests.swift */; };
508975E21DBF3E51006F3DBE /* EnumeratedCSVViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508975E01DBF3E51006F3DBE /* EnumeratedCSVViewTests.swift */; };
508975E31DBF3E51006F3DBE /* EnumeratedCSVViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508975E01DBF3E51006F3DBE /* EnumeratedCSVViewTests.swift */; };
508CA0FB2771F2E70084C8E8 /* CSV+DelimiterGuessing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508CA0FA2771F2E70084C8E8 /* CSV+DelimiterGuessing.swift */; };
508CA0FD2771F3260084C8E8 /* CSVDelimiterGuessingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508CA0FC2771F3260084C8E8 /* CSVDelimiterGuessingTests.swift */; };
508CA0FE2771F3260084C8E8 /* CSVDelimiterGuessingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508CA0FC2771F3260084C8E8 /* CSVDelimiterGuessingTests.swift */; };
508CA0FF2771F3260084C8E8 /* CSVDelimiterGuessingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508CA0FC2771F3260084C8E8 /* CSVDelimiterGuessingTests.swift */; };
508CA1002771F32C0084C8E8 /* CSV+DelimiterGuessing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508CA0FA2771F2E70084C8E8 /* CSV+DelimiterGuessing.swift */; };
508CA1022771F32D0084C8E8 /* CSV+DelimiterGuessing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508CA0FA2771F2E70084C8E8 /* CSV+DelimiterGuessing.swift */; };
508CA1032771F32E0084C8E8 /* CSV+DelimiterGuessing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508CA0FA2771F2E70084C8E8 /* CSV+DelimiterGuessing.swift */; };
508CA1052772039E0084C8E8 /* CSVDelimiterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508CA1042772039E0084C8E8 /* CSVDelimiterTests.swift */; };
508CA1062772039E0084C8E8 /* CSVDelimiterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508CA1042772039E0084C8E8 /* CSVDelimiterTests.swift */; };
508CA1072772039E0084C8E8 /* CSVDelimiterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508CA1042772039E0084C8E8 /* CSVDelimiterTests.swift */; };
50A2B23424894DC900B168A9 /* NewlineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A2B23324894DC900B168A9 /* NewlineTests.swift */; };
50A2B23524894DC900B168A9 /* NewlineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A2B23324894DC900B168A9 /* NewlineTests.swift */; };
50A2B23624894DC900B168A9 /* NewlineTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A2B23324894DC900B168A9 /* NewlineTests.swift */; };
50B3EEA4286F8A84007B3956 /* CSVDelimiter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B3EEA3286F8A84007B3956 /* CSVDelimiter.swift */; };
50B3EEA5286F8AA3007B3956 /* CSVDelimiter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B3EEA3286F8A84007B3956 /* CSVDelimiter.swift */; };
50B3EEA6286F8AA4007B3956 /* CSVDelimiter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B3EEA3286F8A84007B3956 /* CSVDelimiter.swift */; };
50B3EEA7286F8AA5007B3956 /* CSVDelimiter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B3EEA3286F8A84007B3956 /* CSVDelimiter.swift */; };
50B575DA2BEE1E2E006C9262 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 50B575D92BEE1E2E006C9262 /* PrivacyInfo.xcprivacy */; };
50B575DB2BEE1E2E006C9262 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 50B575D92BEE1E2E006C9262 /* PrivacyInfo.xcprivacy */; };
50B575DC2BEE1E2E006C9262 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 50B575D92BEE1E2E006C9262 /* PrivacyInfo.xcprivacy */; };
50B575DD2BEE1E2E006C9262 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 50B575D92BEE1E2E006C9262 /* PrivacyInfo.xcprivacy */; };
5FB74B9B1CCB9274009DDBF1 /* SwiftCSV.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5FB74B911CCB9274009DDBF1 /* SwiftCSV.framework */; };
5FB74BB71CCB929D009DDBF1 /* SwiftCSV.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5FB74BAD1CCB929D009DDBF1 /* SwiftCSV.framework */; };
5FB74BD11CCB92E5009DDBF1 /* CSV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DAAEE9B1C74C7EC00A933DB /* CSV.swift */; };
5FB74BD21CCB92E5009DDBF1 /* String+Lines.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D444BCC1C7D88290001C60C /* String+Lines.swift */; };
5FB74BD51CCB92E5009DDBF1 /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE9B02D71CBE57B8009FE424 /* Parser.swift */; };
5FB74BD61CCB92EB009DDBF1 /* CSV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DAAEE9B1C74C7EC00A933DB /* CSV.swift */; };
5FB74BD71CCB92EB009DDBF1 /* String+Lines.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D444BCC1C7D88290001C60C /* String+Lines.swift */; };
5FB74BDA1CCB92EB009DDBF1 /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE9B02D71CBE57B8009FE424 /* Parser.swift */; };
5FB74BDB1CCB92F1009DDBF1 /* CSV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DAAEE9B1C74C7EC00A933DB /* CSV.swift */; };
5FB74BDC1CCB92F1009DDBF1 /* String+Lines.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D444BCC1C7D88290001C60C /* String+Lines.swift */; };
5FB74BDF1CCB92F1009DDBF1 /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE9B02D71CBE57B8009FE424 /* Parser.swift */; };
5FB74BE01CCB9312009DDBF1 /* NamedCSVViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D1E59C61945FFAD001CF760 /* NamedCSVViewTests.swift */; };
5FB74BE11CCB9312009DDBF1 /* QuotedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE6C86061CB5CE44009A351D /* QuotedTests.swift */; };
5FB74BE21CCB9312009DDBF1 /* TSVTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3749E2194D6DF7008F262A /* TSVTests.swift */; };
5FB74BE31CCB9312009DDBF1 /* URLTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE06B67F1CB726B5009578CC /* URLTests.swift */; };
5FB74BE41CCB9312009DDBF1 /* PerformanceTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E46085931CCB1F5C00385286 /* PerformanceTest.swift */; };
5FB74BE51CCB931F009DDBF1 /* NamedCSVViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D1E59C61945FFAD001CF760 /* NamedCSVViewTests.swift */; };
5FB74BE61CCB931F009DDBF1 /* QuotedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE6C86061CB5CE44009A351D /* QuotedTests.swift */; };
5FB74BE71CCB931F009DDBF1 /* TSVTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D3749E2194D6DF7008F262A /* TSVTests.swift */; };
5FB74BE81CCB931F009DDBF1 /* URLTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE06B67F1CB726B5009578CC /* URLTests.swift */; };
5FB74BE91CCB931F009DDBF1 /* PerformanceTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E46085931CCB1F5C00385286 /* PerformanceTest.swift */; };
BE06B6801CB726B5009578CC /* URLTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE06B67F1CB726B5009578CC /* URLTests.swift */; };
BE6C86071CB5CE44009A351D /* QuotedTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE6C86061CB5CE44009A351D /* QuotedTests.swift */; };
BE9B02D81CBE57B8009FE424 /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE9B02D71CBE57B8009FE424 /* Parser.swift */; };
DDF4064F2AB83CDE00A2B058 /* wonderland.csv in Resources */ = {isa = PBXBuildFile; fileRef = DDF406472AB83CDE00A2B058 /* wonderland.csv */; };
DDF406502AB83CDE00A2B058 /* wonderland.csv in Resources */ = {isa = PBXBuildFile; fileRef = DDF406472AB83CDE00A2B058 /* wonderland.csv */; };
DDF406512AB83CDE00A2B058 /* wonderland.csv in Resources */ = {isa = PBXBuildFile; fileRef = DDF406472AB83CDE00A2B058 /* wonderland.csv */; };
DDF406522AB83CDE00A2B058 /* large.csv in Resources */ = {isa = PBXBuildFile; fileRef = DDF406482AB83CDE00A2B058 /* large.csv */; };
DDF406532AB83CDE00A2B058 /* large.csv in Resources */ = {isa = PBXBuildFile; fileRef = DDF406482AB83CDE00A2B058 /* large.csv */; };
DDF406542AB83CDE00A2B058 /* large.csv in Resources */ = {isa = PBXBuildFile; fileRef = DDF406482AB83CDE00A2B058 /* large.csv */; };
DDF406552AB83CDE00A2B058 /* utf8_with_bom.csv in Resources */ = {isa = PBXBuildFile; fileRef = DDF406492AB83CDE00A2B058 /* utf8_with_bom.csv */; };
DDF406562AB83CDE00A2B058 /* utf8_with_bom.csv in Resources */ = {isa = PBXBuildFile; fileRef = DDF406492AB83CDE00A2B058 /* utf8_with_bom.csv */; };
DDF406572AB83CDE00A2B058 /* utf8_with_bom.csv in Resources */ = {isa = PBXBuildFile; fileRef = DDF406492AB83CDE00A2B058 /* utf8_with_bom.csv */; };
DDF4065E2AB83CDE00A2B058 /* quotes.csv in Resources */ = {isa = PBXBuildFile; fileRef = DDF4064D2AB83CDE00A2B058 /* quotes.csv */; };
DDF4065F2AB83CDE00A2B058 /* quotes.csv in Resources */ = {isa = PBXBuildFile; fileRef = DDF4064D2AB83CDE00A2B058 /* quotes.csv */; };
DDF406602AB83CDE00A2B058 /* quotes.csv in Resources */ = {isa = PBXBuildFile; fileRef = DDF4064D2AB83CDE00A2B058 /* quotes.csv */; };
DDF406612AB83CDE00A2B058 /* empty_fields.csv in Resources */ = {isa = PBXBuildFile; fileRef = DDF4064E2AB83CDE00A2B058 /* empty_fields.csv */; };
DDF406622AB83CDE00A2B058 /* empty_fields.csv in Resources */ = {isa = PBXBuildFile; fileRef = DDF4064E2AB83CDE00A2B058 /* empty_fields.csv */; };
DDF406632AB83CDE00A2B058 /* empty_fields.csv in Resources */ = {isa = PBXBuildFile; fileRef = DDF4064E2AB83CDE00A2B058 /* empty_fields.csv */; };
DFAD8B7B28B601EB0042BB56 /* Serializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFAD8B7A28B601EB0042BB56 /* Serializer.swift */; };
DFAD8B8028BC8B6F0042BB56 /* Serializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFAD8B7A28B601EB0042BB56 /* Serializer.swift */; };
DFAD8B8128BC8B700042BB56 /* Serializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFAD8B7A28B601EB0042BB56 /* Serializer.swift */; };
DFAD8B8228BC8B710042BB56 /* Serializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFAD8B7A28B601EB0042BB56 /* Serializer.swift */; };
E46085941CCB1F5C00385286 /* PerformanceTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E46085931CCB1F5C00385286 /* PerformanceTest.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
3D1E59C11945FFAD001CF760 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 3D1E59AB1945FFAC001CF760 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 3D1E59B31945FFAC001CF760;
remoteInfo = SwiftCSV;
};
3D1E59D419460259001CF760 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 3D1E59AB1945FFAC001CF760 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 3D1E59B31945FFAC001CF760;
remoteInfo = SwiftCSV;
};
5FB74B9C1CCB9274009DDBF1 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 3D1E59AB1945FFAC001CF760 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 5FB74B901CCB9274009DDBF1;
remoteInfo = "SwiftCSV OSX";
};
5FB74BB81CCB929D009DDBF1 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 3D1E59AB1945FFAC001CF760 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 5FB74BAC1CCB929D009DDBF1;
remoteInfo = "SwiftCSV tvOS";
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
3D1E59B41945FFAC001CF760 /* SwiftCSV.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftCSV.framework; sourceTree = BUILT_PRODUCTS_DIR; };
3D1E59BF1945FFAD001CF760 /* SwiftCSVTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftCSVTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3D1E59C61945FFAD001CF760 /* NamedCSVViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NamedCSVViewTests.swift; sourceTree = "<group>"; };
3D3749E2194D6DF7008F262A /* TSVTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TSVTests.swift; sourceTree = "<group>"; };
3D444BCC1C7D88290001C60C /* String+Lines.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+Lines.swift"; sourceTree = "<group>"; };
3DAAEE9B1C74C7EC00A933DB /* CSV.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = CSV.swift; sourceTree = "<group>"; tabWidth = 4; };
5015AD89274BA20A0050F975 /* ParserTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParserTests.swift; sourceTree = "<group>"; };
502CDAF32AC60ADA00766701 /* ResourceHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResourceHelper.swift; sourceTree = "<group>"; };
5034F4712272E0DC001C02D1 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
5034F4722272E0E4001C02D1 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
504F73F02BEF52AA00FF4102 /* Project.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Project.xcconfig; path = Configuration/Project.xcconfig; sourceTree = "<group>"; };
508975D11DBB897A006F3DBE /* NamedCSVView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NamedCSVView.swift; sourceTree = "<group>"; };
508975D61DBF34CF006F3DBE /* ParsingState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParsingState.swift; sourceTree = "<group>"; };
508975DB1DBF3B70006F3DBE /* EnumeratedCSVView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnumeratedCSVView.swift; sourceTree = "<group>"; };
508975E01DBF3E51006F3DBE /* EnumeratedCSVViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnumeratedCSVViewTests.swift; sourceTree = "<group>"; };
508CA0FA2771F2E70084C8E8 /* CSV+DelimiterGuessing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CSV+DelimiterGuessing.swift"; sourceTree = "<group>"; };
508CA0FC2771F3260084C8E8 /* CSVDelimiterGuessingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CSVDelimiterGuessingTests.swift; sourceTree = "<group>"; };
508CA1042772039E0084C8E8 /* CSVDelimiterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CSVDelimiterTests.swift; sourceTree = "<group>"; };
50A2B23324894DC900B168A9 /* NewlineTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewlineTests.swift; sourceTree = "<group>"; };
50B3EEA3286F8A84007B3956 /* CSVDelimiter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CSVDelimiter.swift; sourceTree = "<group>"; };
50B575D92BEE1E2E006C9262 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
50F241A4274BB8DB00520A69 /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = "<group>"; };
50F241A5274BBDF000520A69 /* SwiftCSV.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = SwiftCSV.podspec; sourceTree = "<group>"; };
50F241A6274BBDF000520A69 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = "<group>"; };
5FB74B911CCB9274009DDBF1 /* SwiftCSV.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftCSV.framework; sourceTree = BUILT_PRODUCTS_DIR; };
5FB74B9A1CCB9274009DDBF1 /* SwiftCSVTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftCSVTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
5FB74BAD1CCB929D009DDBF1 /* SwiftCSV.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftCSV.framework; sourceTree = BUILT_PRODUCTS_DIR; };
5FB74BB61CCB929D009DDBF1 /* SwiftCSVTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftCSVTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
5FB74BC91CCB92BA009DDBF1 /* SwiftCSV.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftCSV.framework; sourceTree = BUILT_PRODUCTS_DIR; };
BE06B67F1CB726B5009578CC /* URLTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLTests.swift; sourceTree = "<group>"; };
BE6C86061CB5CE44009A351D /* QuotedTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuotedTests.swift; sourceTree = "<group>"; };
BE9B02D71CBE57B8009FE424 /* Parser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Parser.swift; sourceTree = "<group>"; };
DDF406472AB83CDE00A2B058 /* wonderland.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = wonderland.csv; sourceTree = "<group>"; };
DDF406482AB83CDE00A2B058 /* large.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = large.csv; sourceTree = "<group>"; };
DDF406492AB83CDE00A2B058 /* utf8_with_bom.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = utf8_with_bom.csv; sourceTree = "<group>"; };
DDF4064D2AB83CDE00A2B058 /* quotes.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = quotes.csv; sourceTree = "<group>"; };
DDF4064E2AB83CDE00A2B058 /* empty_fields.csv */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = empty_fields.csv; sourceTree = "<group>"; };
DFAD8B7A28B601EB0042BB56 /* Serializer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Serializer.swift; sourceTree = "<group>"; };
E46085931CCB1F5C00385286 /* PerformanceTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PerformanceTest.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
3D1E59B01945FFAC001CF760 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
3D1E59BC1945FFAD001CF760 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
3D1E59C01945FFAD001CF760 /* SwiftCSV.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74B8D1CCB9274009DDBF1 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74B971CCB9274009DDBF1 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
5FB74B9B1CCB9274009DDBF1 /* SwiftCSV.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74BA91CCB929D009DDBF1 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74BB31CCB929D009DDBF1 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
5FB74BB71CCB929D009DDBF1 /* SwiftCSV.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74BC51CCB92BA009DDBF1 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
3D1E59AA1945FFAC001CF760 = {
isa = PBXGroup;
children = (
5034F4712272E0DC001C02D1 /* README.md */,
5034F4722272E0E4001C02D1 /* LICENSE */,
50F241A4274BB8DB00520A69 /* CHANGELOG.md */,
50F241A6274BBDF000520A69 /* Package.swift */,
50F241A5274BBDF000520A69 /* SwiftCSV.podspec */,
504F73F02BEF52AA00FF4102 /* Project.xcconfig */,
3D1E59B61945FFAC001CF760 /* SwiftCSV */,
3D1E59C31945FFAD001CF760 /* SwiftCSVTests */,
3D1E59B51945FFAC001CF760 /* Products */,
);
indentWidth = 4;
sourceTree = "<group>";
tabWidth = 4;
};
3D1E59B51945FFAC001CF760 /* Products */ = {
isa = PBXGroup;
children = (
3D1E59B41945FFAC001CF760 /* SwiftCSV.framework */,
3D1E59BF1945FFAD001CF760 /* SwiftCSVTests.xctest */,
5FB74B911CCB9274009DDBF1 /* SwiftCSV.framework */,
5FB74B9A1CCB9274009DDBF1 /* SwiftCSVTests.xctest */,
5FB74BAD1CCB929D009DDBF1 /* SwiftCSV.framework */,
5FB74BB61CCB929D009DDBF1 /* SwiftCSVTests.xctest */,
5FB74BC91CCB92BA009DDBF1 /* SwiftCSV.framework */,
);
name = Products;
sourceTree = "<group>";
};
3D1E59B61945FFAC001CF760 /* SwiftCSV */ = {
isa = PBXGroup;
children = (
3DAAEE9B1C74C7EC00A933DB /* CSV.swift */,
50B3EEA3286F8A84007B3956 /* CSVDelimiter.swift */,
508975D11DBB897A006F3DBE /* NamedCSVView.swift */,
508975DB1DBF3B70006F3DBE /* EnumeratedCSVView.swift */,
508CA0FA2771F2E70084C8E8 /* CSV+DelimiterGuessing.swift */,
3D444BCC1C7D88290001C60C /* String+Lines.swift */,
BE9B02D71CBE57B8009FE424 /* Parser.swift */,
508975D61DBF34CF006F3DBE /* ParsingState.swift */,
DFAD8B7A28B601EB0042BB56 /* Serializer.swift */,
50B575D82BEE1E2E006C9262 /* Resources */,
);
path = SwiftCSV;
sourceTree = "<group>";
};
3D1E59C31945FFAD001CF760 /* SwiftCSVTests */ = {
isa = PBXGroup;
children = (
502CDAF32AC60ADA00766701 /* ResourceHelper.swift */,
DDF406462AB83CDE00A2B058 /* Resources */,
3D1E59C61945FFAD001CF760 /* NamedCSVViewTests.swift */,
508975E01DBF3E51006F3DBE /* EnumeratedCSVViewTests.swift */,
50A2B23324894DC900B168A9 /* NewlineTests.swift */,
508CA0FC2771F3260084C8E8 /* CSVDelimiterGuessingTests.swift */,
508CA1042772039E0084C8E8 /* CSVDelimiterTests.swift */,
BE6C86061CB5CE44009A351D /* QuotedTests.swift */,
3D3749E2194D6DF7008F262A /* TSVTests.swift */,
BE06B67F1CB726B5009578CC /* URLTests.swift */,
E46085931CCB1F5C00385286 /* PerformanceTest.swift */,
5015AD89274BA20A0050F975 /* ParserTests.swift */,
);
path = SwiftCSVTests;
sourceTree = "<group>";
};
50B575D82BEE1E2E006C9262 /* Resources */ = {
isa = PBXGroup;
children = (
50B575D92BEE1E2E006C9262 /* PrivacyInfo.xcprivacy */,
);
path = Resources;
sourceTree = "<group>";
};
DDF406462AB83CDE00A2B058 /* Resources */ = {
isa = PBXGroup;
children = (
DDF406472AB83CDE00A2B058 /* wonderland.csv */,
DDF406482AB83CDE00A2B058 /* large.csv */,
DDF406492AB83CDE00A2B058 /* utf8_with_bom.csv */,
DDF4064D2AB83CDE00A2B058 /* quotes.csv */,
DDF4064E2AB83CDE00A2B058 /* empty_fields.csv */,
);
name = Resources;
path = SwiftCSVTests/TestData;
sourceTree = SOURCE_ROOT;
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
3D1E59B11945FFAC001CF760 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74B8E1CCB9274009DDBF1 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74BAA1CCB929D009DDBF1 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74BC61CCB92BA009DDBF1 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
3D1E59B31945FFAC001CF760 /* SwiftCSV */ = {
isa = PBXNativeTarget;
buildConfigurationList = 3D1E59CA1945FFAD001CF760 /* Build configuration list for PBXNativeTarget "SwiftCSV" */;
buildPhases = (
3D1E59AF1945FFAC001CF760 /* Sources */,
3D1E59B01945FFAC001CF760 /* Frameworks */,
3D1E59B11945FFAC001CF760 /* Headers */,
3D1E59B21945FFAC001CF760 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = SwiftCSV;
productName = SwiftCSV;
productReference = 3D1E59B41945FFAC001CF760 /* SwiftCSV.framework */;
productType = "com.apple.product-type.framework";
};
3D1E59BE1945FFAD001CF760 /* SwiftCSVTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 3D1E59CD1945FFAD001CF760 /* Build configuration list for PBXNativeTarget "SwiftCSVTests" */;
buildPhases = (
3D1E59BB1945FFAD001CF760 /* Sources */,
3D1E59BC1945FFAD001CF760 /* Frameworks */,
3D1E59BD1945FFAD001CF760 /* Resources */,
);
buildRules = (
);
dependencies = (
3D1E59C21945FFAD001CF760 /* PBXTargetDependency */,
3D1E59D519460259001CF760 /* PBXTargetDependency */,
);
name = SwiftCSVTests;
productName = SwiftCSVTests;
productReference = 3D1E59BF1945FFAD001CF760 /* SwiftCSVTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
5FB74B901CCB9274009DDBF1 /* SwiftCSV OSX */ = {
isa = PBXNativeTarget;
buildConfigurationList = 5FB74BA61CCB9274009DDBF1 /* Build configuration list for PBXNativeTarget "SwiftCSV OSX" */;
buildPhases = (
5FB74B8C1CCB9274009DDBF1 /* Sources */,
5FB74B8D1CCB9274009DDBF1 /* Frameworks */,
5FB74B8E1CCB9274009DDBF1 /* Headers */,
5FB74B8F1CCB9274009DDBF1 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = "SwiftCSV OSX";
productName = "SwiftCSV OSX";
productReference = 5FB74B911CCB9274009DDBF1 /* SwiftCSV.framework */;
productType = "com.apple.product-type.framework";
};
5FB74B991CCB9274009DDBF1 /* SwiftCSV OSXTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 5FB74BA71CCB9274009DDBF1 /* Build configuration list for PBXNativeTarget "SwiftCSV OSXTests" */;
buildPhases = (
5FB74B961CCB9274009DDBF1 /* Sources */,
5FB74B971CCB9274009DDBF1 /* Frameworks */,
5FB74B981CCB9274009DDBF1 /* Resources */,
);
buildRules = (
);
dependencies = (
5FB74B9D1CCB9274009DDBF1 /* PBXTargetDependency */,
);
name = "SwiftCSV OSXTests";
productName = "SwiftCSV OSXTests";
productReference = 5FB74B9A1CCB9274009DDBF1 /* SwiftCSVTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
5FB74BAC1CCB929D009DDBF1 /* SwiftCSV tvOS */ = {
isa = PBXNativeTarget;
buildConfigurationList = 5FB74BBE1CCB929D009DDBF1 /* Build configuration list for PBXNativeTarget "SwiftCSV tvOS" */;
buildPhases = (
5FB74BA81CCB929D009DDBF1 /* Sources */,
5FB74BA91CCB929D009DDBF1 /* Frameworks */,
5FB74BAA1CCB929D009DDBF1 /* Headers */,
5FB74BAB1CCB929D009DDBF1 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = "SwiftCSV tvOS";
productName = "SwiftCSV tvOS";
productReference = 5FB74BAD1CCB929D009DDBF1 /* SwiftCSV.framework */;
productType = "com.apple.product-type.framework";
};
5FB74BB51CCB929D009DDBF1 /* SwiftCSV tvOSTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 5FB74BC11CCB929D009DDBF1 /* Build configuration list for PBXNativeTarget "SwiftCSV tvOSTests" */;
buildPhases = (
5FB74BB21CCB929D009DDBF1 /* Sources */,
5FB74BB31CCB929D009DDBF1 /* Frameworks */,
5FB74BB41CCB929D009DDBF1 /* Resources */,
);
buildRules = (
);
dependencies = (
5FB74BB91CCB929D009DDBF1 /* PBXTargetDependency */,
);
name = "SwiftCSV tvOSTests";
productName = "SwiftCSV tvOSTests";
productReference = 5FB74BB61CCB929D009DDBF1 /* SwiftCSVTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
5FB74BC81CCB92BA009DDBF1 /* SwiftCSV watchOS */ = {
isa = PBXNativeTarget;
buildConfigurationList = 5FB74BCE1CCB92BA009DDBF1 /* Build configuration list for PBXNativeTarget "SwiftCSV watchOS" */;
buildPhases = (
5FB74BC41CCB92BA009DDBF1 /* Sources */,
5FB74BC51CCB92BA009DDBF1 /* Frameworks */,
5FB74BC61CCB92BA009DDBF1 /* Headers */,
5FB74BC71CCB92BA009DDBF1 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = "SwiftCSV watchOS";
productName = "SwiftCSV watchOS";
productReference = 5FB74BC91CCB92BA009DDBF1 /* SwiftCSV.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
3D1E59AB1945FFAC001CF760 /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastSwiftMigration = 0700;
LastSwiftUpdateCheck = 0730;
LastUpgradeCheck = 1500;
ORGANIZATIONNAME = SwiftCSV;
TargetAttributes = {
3D1E59B31945FFAC001CF760 = {
CreatedOnToolsVersion = 6.0;
LastSwiftMigration = 1020;
};
3D1E59BE1945FFAD001CF760 = {
CreatedOnToolsVersion = 6.0;
LastSwiftMigration = 1020;
TestTargetID = 3D1E59B31945FFAC001CF760;
};
5FB74B901CCB9274009DDBF1 = {
CreatedOnToolsVersion = 7.3;
LastSwiftMigration = 1020;
};
5FB74B991CCB9274009DDBF1 = {
CreatedOnToolsVersion = 7.3;
LastSwiftMigration = 1020;
};
5FB74BAC1CCB929D009DDBF1 = {
CreatedOnToolsVersion = 7.3;
LastSwiftMigration = 1020;
};
5FB74BB51CCB929D009DDBF1 = {
CreatedOnToolsVersion = 7.3;
LastSwiftMigration = 1020;
};
5FB74BC81CCB92BA009DDBF1 = {
CreatedOnToolsVersion = 7.3;
LastSwiftMigration = 1020;
};
};
};
buildConfigurationList = 3D1E59AE1945FFAC001CF760 /* Build configuration list for PBXProject "SwiftCSV" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 3D1E59AA1945FFAC001CF760;
productRefGroup = 3D1E59B51945FFAC001CF760 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
3D1E59B31945FFAC001CF760 /* SwiftCSV */,
3D1E59BE1945FFAD001CF760 /* SwiftCSVTests */,
5FB74B901CCB9274009DDBF1 /* SwiftCSV OSX */,
5FB74B991CCB9274009DDBF1 /* SwiftCSV OSXTests */,
5FB74BAC1CCB929D009DDBF1 /* SwiftCSV tvOS */,
5FB74BB51CCB929D009DDBF1 /* SwiftCSV tvOSTests */,
5FB74BC81CCB92BA009DDBF1 /* SwiftCSV watchOS */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
3D1E59B21945FFAC001CF760 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
50B575DA2BEE1E2E006C9262 /* PrivacyInfo.xcprivacy in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
3D1E59BD1945FFAD001CF760 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
DDF406522AB83CDE00A2B058 /* large.csv in Resources */,
DDF406552AB83CDE00A2B058 /* utf8_with_bom.csv in Resources */,
DDF406612AB83CDE00A2B058 /* empty_fields.csv in Resources */,
DDF4064F2AB83CDE00A2B058 /* wonderland.csv in Resources */,
DDF4065E2AB83CDE00A2B058 /* quotes.csv in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74B8F1CCB9274009DDBF1 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
50B575DB2BEE1E2E006C9262 /* PrivacyInfo.xcprivacy in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74B981CCB9274009DDBF1 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
DDF406532AB83CDE00A2B058 /* large.csv in Resources */,
DDF406562AB83CDE00A2B058 /* utf8_with_bom.csv in Resources */,
DDF406622AB83CDE00A2B058 /* empty_fields.csv in Resources */,
DDF406502AB83CDE00A2B058 /* wonderland.csv in Resources */,
DDF4065F2AB83CDE00A2B058 /* quotes.csv in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74BAB1CCB929D009DDBF1 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
50B575DC2BEE1E2E006C9262 /* PrivacyInfo.xcprivacy in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74BB41CCB929D009DDBF1 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
DDF406542AB83CDE00A2B058 /* large.csv in Resources */,
DDF406572AB83CDE00A2B058 /* utf8_with_bom.csv in Resources */,
DDF406632AB83CDE00A2B058 /* empty_fields.csv in Resources */,
DDF406512AB83CDE00A2B058 /* wonderland.csv in Resources */,
DDF406602AB83CDE00A2B058 /* quotes.csv in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74BC71CCB92BA009DDBF1 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
50B575DD2BEE1E2E006C9262 /* PrivacyInfo.xcprivacy in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
3D1E59AF1945FFAC001CF760 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
50B3EEA4286F8A84007B3956 /* CSVDelimiter.swift in Sources */,
DFAD8B7B28B601EB0042BB56 /* Serializer.swift in Sources */,
508975D21DBB897A006F3DBE /* NamedCSVView.swift in Sources */,
508CA0FB2771F2E70084C8E8 /* CSV+DelimiterGuessing.swift in Sources */,
3DAAEE9C1C74C7EC00A933DB /* CSV.swift in Sources */,
BE9B02D81CBE57B8009FE424 /* Parser.swift in Sources */,
508975DC1DBF3B70006F3DBE /* EnumeratedCSVView.swift in Sources */,
508975D71DBF34CF006F3DBE /* ParsingState.swift in Sources */,
3D444BCD1C7D88290001C60C /* String+Lines.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
3D1E59BB1945FFAD001CF760 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E46085941CCB1F5C00385286 /* PerformanceTest.swift in Sources */,
3D1E59C71945FFAD001CF760 /* NamedCSVViewTests.swift in Sources */,
50A2B23424894DC900B168A9 /* NewlineTests.swift in Sources */,
508CA0FD2771F3260084C8E8 /* CSVDelimiterGuessingTests.swift in Sources */,
508975E11DBF3E51006F3DBE /* EnumeratedCSVViewTests.swift in Sources */,
508CA1052772039E0084C8E8 /* CSVDelimiterTests.swift in Sources */,
5015AD8A274BA20A0050F975 /* ParserTests.swift in Sources */,
3D3749E3194D6DF7008F262A /* TSVTests.swift in Sources */,
BE06B6801CB726B5009578CC /* URLTests.swift in Sources */,
BE6C86071CB5CE44009A351D /* QuotedTests.swift in Sources */,
502CDAF42AC60ADA00766701 /* ResourceHelper.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74B8C1CCB9274009DDBF1 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
50B3EEA5286F8AA3007B3956 /* CSVDelimiter.swift in Sources */,
DFAD8B8228BC8B710042BB56 /* Serializer.swift in Sources */,
508975D31DBB897A006F3DBE /* NamedCSVView.swift in Sources */,
508CA1002771F32C0084C8E8 /* CSV+DelimiterGuessing.swift in Sources */,
5FB74BD11CCB92E5009DDBF1 /* CSV.swift in Sources */,
5FB74BD21CCB92E5009DDBF1 /* String+Lines.swift in Sources */,
508975DD1DBF3B70006F3DBE /* EnumeratedCSVView.swift in Sources */,
508975D81DBF34CF006F3DBE /* ParsingState.swift in Sources */,
5FB74BD51CCB92E5009DDBF1 /* Parser.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74B961CCB9274009DDBF1 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
5FB74BE01CCB9312009DDBF1 /* NamedCSVViewTests.swift in Sources */,
5FB74BE11CCB9312009DDBF1 /* QuotedTests.swift in Sources */,
50A2B23524894DC900B168A9 /* NewlineTests.swift in Sources */,
508CA0FE2771F3260084C8E8 /* CSVDelimiterGuessingTests.swift in Sources */,
508975E21DBF3E51006F3DBE /* EnumeratedCSVViewTests.swift in Sources */,
508CA1062772039E0084C8E8 /* CSVDelimiterTests.swift in Sources */,
5015AD8B274BA20A0050F975 /* ParserTests.swift in Sources */,
5FB74BE21CCB9312009DDBF1 /* TSVTests.swift in Sources */,
5FB74BE31CCB9312009DDBF1 /* URLTests.swift in Sources */,
5FB74BE41CCB9312009DDBF1 /* PerformanceTest.swift in Sources */,
502CDAF52AC60ADA00766701 /* ResourceHelper.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74BA81CCB929D009DDBF1 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
50B3EEA6286F8AA4007B3956 /* CSVDelimiter.swift in Sources */,
DFAD8B8128BC8B700042BB56 /* Serializer.swift in Sources */,
508975D41DBB897A006F3DBE /* NamedCSVView.swift in Sources */,
508CA1022771F32D0084C8E8 /* CSV+DelimiterGuessing.swift in Sources */,
5FB74BD61CCB92EB009DDBF1 /* CSV.swift in Sources */,
5FB74BD71CCB92EB009DDBF1 /* String+Lines.swift in Sources */,
508975DE1DBF3B70006F3DBE /* EnumeratedCSVView.swift in Sources */,
508975D91DBF34CF006F3DBE /* ParsingState.swift in Sources */,
5FB74BDA1CCB92EB009DDBF1 /* Parser.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74BB21CCB929D009DDBF1 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
5FB74BE51CCB931F009DDBF1 /* NamedCSVViewTests.swift in Sources */,
5FB74BE61CCB931F009DDBF1 /* QuotedTests.swift in Sources */,
50A2B23624894DC900B168A9 /* NewlineTests.swift in Sources */,
508CA0FF2771F3260084C8E8 /* CSVDelimiterGuessingTests.swift in Sources */,
508975E31DBF3E51006F3DBE /* EnumeratedCSVViewTests.swift in Sources */,
508CA1072772039E0084C8E8 /* CSVDelimiterTests.swift in Sources */,
5015AD8C274BA20A0050F975 /* ParserTests.swift in Sources */,
5FB74BE71CCB931F009DDBF1 /* TSVTests.swift in Sources */,
5FB74BE81CCB931F009DDBF1 /* URLTests.swift in Sources */,
5FB74BE91CCB931F009DDBF1 /* PerformanceTest.swift in Sources */,
502CDAF62AC60ADA00766701 /* ResourceHelper.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
5FB74BC41CCB92BA009DDBF1 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
50B3EEA7286F8AA5007B3956 /* CSVDelimiter.swift in Sources */,
DFAD8B8028BC8B6F0042BB56 /* Serializer.swift in Sources */,
508975D51DBB897A006F3DBE /* NamedCSVView.swift in Sources */,
508CA1032771F32E0084C8E8 /* CSV+DelimiterGuessing.swift in Sources */,
5FB74BDB1CCB92F1009DDBF1 /* CSV.swift in Sources */,
5FB74BDC1CCB92F1009DDBF1 /* String+Lines.swift in Sources */,
508975DF1DBF3B70006F3DBE /* EnumeratedCSVView.swift in Sources */,
508975DA1DBF34CF006F3DBE /* ParsingState.swift in Sources */,
5FB74BDF1CCB92F1009DDBF1 /* Parser.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
3D1E59C21945FFAD001CF760 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 3D1E59B31945FFAC001CF760 /* SwiftCSV */;
targetProxy = 3D1E59C11945FFAD001CF760 /* PBXContainerItemProxy */;
};
3D1E59D519460259001CF760 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 3D1E59B31945FFAC001CF760 /* SwiftCSV */;
targetProxy = 3D1E59D419460259001CF760 /* PBXContainerItemProxy */;
};
5FB74B9D1CCB9274009DDBF1 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 5FB74B901CCB9274009DDBF1 /* SwiftCSV OSX */;
targetProxy = 5FB74B9C1CCB9274009DDBF1 /* PBXContainerItemProxy */;
};
5FB74BB91CCB929D009DDBF1 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 5FB74BAC1CCB929D009DDBF1 /* SwiftCSV tvOS */;
targetProxy = 5FB74BB81CCB929D009DDBF1 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
3D1E59C81945FFAD001CF760 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 504F73F02BEF52AA00FF4102 /* Project.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
METAL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
3D1E59C91945FFAD001CF760 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 504F73F02BEF52AA00FF4102 /* Project.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
COPY_PHASE_STRIP = YES;
CURRENT_PROJECT_VERSION = 1;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
METAL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
3D1E59CB1945FFAD001CF760 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "";
CODE_SIGN_STYLE = Automatic;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = YES;
INFOPLIST_FILE = "SwiftCSV.xcodeproj/SwiftCSV-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MARKETING_VERSION = 0.8.1;
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11";
PRODUCT_BUNDLE_IDENTIFIER = "naoty.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
};
name = Debug;
};
3D1E59CC1945FFAD001CF760 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_IDENTITY = "";
CODE_SIGN_STYLE = Automatic;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = YES;
INFOPLIST_FILE = "SwiftCSV.xcodeproj/SwiftCSV-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MARKETING_VERSION = 0.8.1;
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11";
PRODUCT_BUNDLE_IDENTIFIER = "naoty.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SWIFT_VERSION = 5.0;
};
name = Release;
};
3D1E59CE1945FFAD001CF760 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = "";
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
INFOPLIST_FILE = "SwiftCSV.xcodeproj/SwiftCSVTests-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
METAL_ENABLE_DEBUG_INFO = YES;
PRODUCT_BUNDLE_IDENTIFIER = "naoty.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
};
name = Debug;
};
3D1E59CF1945FFAD001CF760 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = "";
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = "SwiftCSV.xcodeproj/SwiftCSVTests-Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
METAL_ENABLE_DEBUG_INFO = NO;
PRODUCT_BUNDLE_IDENTIFIER = "naoty.${PRODUCT_NAME:rfc1034identifier}";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = iphoneos;
SWIFT_VERSION = 5.0;
};
name = Release;
};
5FB74BA21CCB9274009DDBF1 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CODE_SIGN_IDENTITY = "";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = YES;
FRAMEWORK_VERSION = A;
GCC_NO_COMMON_BLOCKS = YES;
INFOPLIST_FILE = "SwiftCSV.xcodeproj/SwiftCSV-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.13;
MARKETING_VERSION = 0.8.0;
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11";
MTL_ENABLE_DEBUG_INFO = YES;
PRODUCT_BUNDLE_IDENTIFIER = "naoty.SwiftCSV.SwiftCSV-OSX";
PRODUCT_NAME = SwiftCSV;
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = macosx;
SKIP_INSTALL = YES;
SWIFT_VERSION = 5.0;
};
name = Debug;
};
5FB74BA31CCB9274009DDBF1 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CODE_SIGN_IDENTITY = "";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = YES;
FRAMEWORK_VERSION = A;
GCC_NO_COMMON_BLOCKS = YES;
INFOPLIST_FILE = "SwiftCSV.xcodeproj/SwiftCSV-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.13;
MARKETING_VERSION = 0.8.0;
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11";
MTL_ENABLE_DEBUG_INFO = NO;
PRODUCT_BUNDLE_IDENTIFIER = "naoty.SwiftCSV.SwiftCSV-OSX";
PRODUCT_NAME = SwiftCSV;
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = macosx;
SKIP_INSTALL = YES;
SWIFT_VERSION = 5.0;
};
name = Release;
};
5FB74BA41CCB9274009DDBF1 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = "";
GCC_NO_COMMON_BLOCKS = YES;
INFOPLIST_FILE = "SwiftCSV.xcodeproj/SwiftCSVTests-Info.plist";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)";
MTL_ENABLE_DEBUG_INFO = YES;
PRODUCT_BUNDLE_IDENTIFIER = "naoty.SwiftCSV.SwiftCSV-OSXTests";
PRODUCT_NAME = SwiftCSVTests;
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = macosx;
SWIFT_VERSION = 5.0;
};
name = Debug;
};
5FB74BA51CCB9274009DDBF1 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO;
DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = "";
GCC_NO_COMMON_BLOCKS = YES;
INFOPLIST_FILE = "SwiftCSV.xcodeproj/SwiftCSVTests-Info.plist";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@loader_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)";
MTL_ENABLE_DEBUG_INFO = NO;
PRODUCT_BUNDLE_IDENTIFIER = "naoty.SwiftCSV.SwiftCSV-OSXTests";
PRODUCT_NAME = SwiftCSVTests;
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = macosx;
SWIFT_VERSION = 5.0;
};
name = Release;
};
5FB74BBF1CCB929D009DDBF1 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CODE_SIGN_IDENTITY = "";
CODE_SIGN_STYLE = Automatic;
DEBUG_INFORMATION_FORMAT = dwarf;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = YES;
GCC_NO_COMMON_BLOCKS = YES;
INFOPLIST_FILE = "SwiftCSV.xcodeproj/SwiftCSV-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MARKETING_VERSION = 0.8.0;
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11";
MTL_ENABLE_DEBUG_INFO = YES;
PRODUCT_BUNDLE_IDENTIFIER = "naoty.SwiftCSV.SwiftCSV-tvOS";
PRODUCT_NAME = SwiftCSV;
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = appletvos;
SKIP_INSTALL = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,3";
TVOS_DEPLOYMENT_TARGET = 12.0;
};
name = Debug;
};
5FB74BC01CCB929D009DDBF1 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CODE_SIGN_IDENTITY = "";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = YES;
GCC_NO_COMMON_BLOCKS = YES;
INFOPLIST_FILE = "SwiftCSV.xcodeproj/SwiftCSV-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MARKETING_VERSION = 0.8.0;
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11";
MTL_ENABLE_DEBUG_INFO = NO;
PRODUCT_BUNDLE_IDENTIFIER = "naoty.SwiftCSV.SwiftCSV-tvOS";
PRODUCT_NAME = SwiftCSV;
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = appletvos;
SKIP_INSTALL = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,3";
TVOS_DEPLOYMENT_TARGET = 12.0;
};
name = Release;
};
5FB74BC21CCB929D009DDBF1 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
GCC_NO_COMMON_BLOCKS = YES;
INFOPLIST_FILE = "SwiftCSV.xcodeproj/SwiftCSVTests-Info.plist";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MTL_ENABLE_DEBUG_INFO = YES;
PRODUCT_BUNDLE_IDENTIFIER = "naoty.SwiftCSV.SwiftCSV-tvOSTests";
PRODUCT_NAME = SwiftCSVTests;
SDKROOT = appletvos;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,3";
TVOS_DEPLOYMENT_TARGET = 12.0;
};
name = Debug;
};
5FB74BC31CCB929D009DDBF1 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GCC_NO_COMMON_BLOCKS = YES;
INFOPLIST_FILE = "SwiftCSV.xcodeproj/SwiftCSVTests-Info.plist";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MTL_ENABLE_DEBUG_INFO = NO;
PRODUCT_BUNDLE_IDENTIFIER = "naoty.SwiftCSV.SwiftCSV-tvOSTests";
PRODUCT_NAME = SwiftCSVTests;
SDKROOT = appletvos;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,3";
TVOS_DEPLOYMENT_TARGET = 12.0;
};
name = Release;
};
5FB74BCF1CCB92BA009DDBF1 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ANALYZER_NONNULL = YES;
CODE_SIGN_IDENTITY = "";
CODE_SIGN_STYLE = Automatic;
DEBUG_INFORMATION_FORMAT = dwarf;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = YES;
GCC_NO_COMMON_BLOCKS = YES;
INFOPLIST_FILE = "SwiftCSV.xcodeproj/SwiftCSV-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11";
MTL_ENABLE_DEBUG_INFO = YES;
PRODUCT_BUNDLE_IDENTIFIER = "naoty.SwiftCSV.SwiftCSV-watchOS";
PRODUCT_NAME = SwiftCSV;
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = watchos;
SKIP_INSTALL = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
WATCHOS_DEPLOYMENT_TARGET = 4.0;
};
name = Debug;
};
5FB74BD01CCB92BA009DDBF1 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
APPLICATION_EXTENSION_API_ONLY = YES;
CLANG_ANALYZER_NONNULL = YES;
CODE_SIGN_IDENTITY = "";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = YES;
GCC_NO_COMMON_BLOCKS = YES;
INFOPLIST_FILE = "SwiftCSV.xcodeproj/SwiftCSV-Info.plist";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu99 gnu++11";
MTL_ENABLE_DEBUG_INFO = NO;
PRODUCT_BUNDLE_IDENTIFIER = "naoty.SwiftCSV.SwiftCSV-watchOS";
PRODUCT_NAME = SwiftCSV;
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = watchos;
SKIP_INSTALL = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
WATCHOS_DEPLOYMENT_TARGET = 4.0;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
3D1E59AE1945FFAC001CF760 /* Build configuration list for PBXProject "SwiftCSV" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3D1E59C81945FFAD001CF760 /* Debug */,
3D1E59C91945FFAD001CF760 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
3D1E59CA1945FFAD001CF760 /* Build configuration list for PBXNativeTarget "SwiftCSV" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3D1E59CB1945FFAD001CF760 /* Debug */,
3D1E59CC1945FFAD001CF760 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
3D1E59CD1945FFAD001CF760 /* Build configuration list for PBXNativeTarget "SwiftCSVTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
3D1E59CE1945FFAD001CF760 /* Debug */,
3D1E59CF1945FFAD001CF760 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
5FB74BA61CCB9274009DDBF1 /* Build configuration list for PBXNativeTarget "SwiftCSV OSX" */ = {
isa = XCConfigurationList;
buildConfigurations = (
5FB74BA21CCB9274009DDBF1 /* Debug */,
5FB74BA31CCB9274009DDBF1 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
5FB74BA71CCB9274009DDBF1 /* Build configuration list for PBXNativeTarget "SwiftCSV OSXTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
5FB74BA41CCB9274009DDBF1 /* Debug */,
5FB74BA51CCB9274009DDBF1 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
5FB74BBE1CCB929D009DDBF1 /* Build configuration list for PBXNativeTarget "SwiftCSV tvOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
5FB74BBF1CCB929D009DDBF1 /* Debug */,
5FB74BC01CCB929D009DDBF1 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
5FB74BC11CCB929D009DDBF1 /* Build configuration list for PBXNativeTarget "SwiftCSV tvOSTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
5FB74BC21CCB929D009DDBF1 /* Debug */,
5FB74BC31CCB929D009DDBF1 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
5FB74BCE1CCB92BA009DDBF1 /* Build configuration list for PBXNativeTarget "SwiftCSV watchOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
5FB74BCF1CCB92BA009DDBF1 /* Debug */,
5FB74BD01CCB92BA009DDBF1 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 3D1E59AB1945FFAC001CF760 /* Project object */;
}
================================================
FILE: SwiftCSV.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:SwiftCSV.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: SwiftCSV.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
================================================
FILE: SwiftCSV.xcodeproj/xcshareddata/xcbaselines/3D1E59BE1945FFAD001CF760.xcbaseline/210222BF-FF70-4818-9C2E-20B20A9F7F48.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>classNames</key>
<dict>
<key>BigFileTest</key>
<dict>
<key>testPerformanceExample()</key>
<dict>
<key>com.apple.XCTPerformanceMetric_WallClockTime</key>
<dict>
<key>baselineAverage</key>
<real>10.622</real>
<key>baselineIntegrationDisplayName</key>
<string>Local Baseline</string>
</dict>
</dict>
</dict>
</dict>
</dict>
</plist>
================================================
FILE: SwiftCSV.xcodeproj/xcshareddata/xcbaselines/3D1E59BE1945FFAD001CF760.xcbaseline/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>runDestinationsByUUID</key>
<dict>
<key>210222BF-FF70-4818-9C2E-20B20A9F7F48</key>
<dict>
<key>localComputer</key>
<dict>
<key>busSpeedInMHz</key>
<integer>100</integer>
<key>cpuCount</key>
<integer>1</integer>
<key>cpuKind</key>
<string>Intel Core i5</string>
<key>cpuSpeedInMHz</key>
<integer>1300</integer>
<key>logicalCPUCoresPerPackage</key>
<integer>4</integer>
<key>modelCode</key>
<string>MacBookAir6,2</string>
<key>physicalCPUCoresPerPackage</key>
<integer>2</integer>
<key>platformIdentifier</key>
<string>com.apple.platform.macosx</string>
</dict>
<key>targetArchitecture</key>
<string>x86_64</string>
<key>targetDevice</key>
<dict>
<key>modelCode</key>
<string>iPhone8,2</string>
<key>platformIdentifier</key>
<string>com.apple.platform.iphonesimulator</string>
</dict>
</dict>
</dict>
</dict>
</plist>
================================================
FILE: SwiftCSV.xcodeproj/xcshareddata/xcschemes/SwiftCSV-iOS.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1500"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "3D1E59B31945FFAC001CF760"
BuildableName = "SwiftCSV.framework"
BlueprintName = "SwiftCSV"
ReferencedContainer = "container:SwiftCSV.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "NO"
buildForProfiling = "NO"
buildForArchiving = "NO"
buildForAnalyzing = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "3D1E59BE1945FFAD001CF760"
BuildableName = "SwiftCSVTests.xctest"
BlueprintName = "SwiftCSVTests"
ReferencedContainer = "container:SwiftCSV.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
codeCoverageEnabled = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "3D1E59BE1945FFAD001CF760"
BuildableName = "SwiftCSVTests.xctest"
BlueprintName = "SwiftCSVTests"
ReferencedContainer = "container:SwiftCSV.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "3D1E59B31945FFAC001CF760"
BuildableName = "SwiftCSV.framework"
BlueprintName = "SwiftCSV"
ReferencedContainer = "container:SwiftCSV.xcodeproj">
</BuildableReference>
</MacroExpansion>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "3D1E59B31945FFAC001CF760"
BuildableName = "SwiftCSV.framework"
BlueprintName = "SwiftCSV"
ReferencedContainer = "container:SwiftCSV.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: SwiftCSV.xcodeproj/xcshareddata/xcschemes/SwiftCSV-macOS.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1500"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "5FB74B901CCB9274009DDBF1"
BuildableName = "SwiftCSV.framework"
BlueprintName = "SwiftCSV OSX"
ReferencedContainer = "container:SwiftCSV.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
codeCoverageEnabled = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "5FB74B991CCB9274009DDBF1"
BuildableName = "SwiftCSVTests.xctest"
BlueprintName = "SwiftCSV OSXTests"
ReferencedContainer = "container:SwiftCSV.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "5FB74B901CCB9274009DDBF1"
BuildableName = "SwiftCSV.framework"
BlueprintName = "SwiftCSV OSX"
ReferencedContainer = "container:SwiftCSV.xcodeproj">
</BuildableReference>
</MacroExpansion>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "5FB74B901CCB9274009DDBF1"
BuildableName = "SwiftCSV.framework"
BlueprintName = "SwiftCSV OSX"
ReferencedContainer = "container:SwiftCSV.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: SwiftCSV.xcodeproj/xcshareddata/xcschemes/SwiftCSV-tvOS.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1500"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "5FB74BAC1CCB929D009DDBF1"
BuildableName = "SwiftCSV.framework"
BlueprintName = "SwiftCSV tvOS"
ReferencedContainer = "container:SwiftCSV.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
codeCoverageEnabled = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "5FB74BB51CCB929D009DDBF1"
BuildableName = "SwiftCSVTests.xctest"
BlueprintName = "SwiftCSV tvOSTests"
ReferencedContainer = "container:SwiftCSV.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "5FB74BAC1CCB929D009DDBF1"
BuildableName = "SwiftCSV.framework"
BlueprintName = "SwiftCSV tvOS"
ReferencedContainer = "container:SwiftCSV.xcodeproj">
</BuildableReference>
</MacroExpansion>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "5FB74BAC1CCB929D009DDBF1"
BuildableName = "SwiftCSV.framework"
BlueprintName = "SwiftCSV tvOS"
ReferencedContainer = "container:SwiftCSV.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: SwiftCSV.xcodeproj/xcshareddata/xcschemes/SwiftCSV-watchOS.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1500"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "5FB74BC81CCB92BA009DDBF1"
BuildableName = "SwiftCSV.framework"
BlueprintName = "SwiftCSV watchOS"
ReferencedContainer = "container:SwiftCSV.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
codeCoverageEnabled = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "5FB74BC81CCB92BA009DDBF1"
BuildableName = "SwiftCSV.framework"
BlueprintName = "SwiftCSV watchOS"
ReferencedContainer = "container:SwiftCSV.xcodeproj">
</BuildableReference>
</MacroExpansion>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "5FB74BC81CCB92BA009DDBF1"
BuildableName = "SwiftCSV.framework"
BlueprintName = "SwiftCSV watchOS"
ReferencedContainer = "container:SwiftCSV.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: SwiftCSVTests/CSVDelimiterGuessingTests.swift
================================================
//
// CSVDelimiterGuessingTests.swift
// SwiftCSV
//
// Created by Christian Tietze on 21.12.21.
// Copyright © 2021 Naoto Kaneko. All rights reserved.
//
import XCTest
@testable import SwiftCSV
class CSVDelimiterGuessingTests: XCTestCase {
func testGuessDelimiter_InvalidInput_FallbackToComma() throws {
XCTAssertEqual(CSVDelimiter.guessed(string: ""), .comma)
XCTAssertEqual(CSVDelimiter.guessed(string: " "), .comma)
XCTAssertEqual(CSVDelimiter.guessed(string: "fallback"), .comma)
XCTAssertEqual(CSVDelimiter.guessed(string: #""opened;quote;never;closed"#), .comma)
XCTAssertEqual(CSVDelimiter.guessed(string: "just a single line of text"), .comma)
XCTAssertEqual(CSVDelimiter.guessed(string: "\n"), .comma)
}
func testGuessDelimiter_Comma() throws {
XCTAssertEqual(CSVDelimiter.guessed(string: "header,"), .comma)
XCTAssertEqual(CSVDelimiter.guessed(string: "id,name,age"), .comma)
XCTAssertEqual(CSVDelimiter.guessed(string: #""a","b","c""#), .comma)
XCTAssertEqual(CSVDelimiter.guessed(string: #""a;","b\t","c""#), .comma,
"Prioritizes separator between quotations over first occurrence")
}
func testGuessDelimiter_Semicolon() throws {
XCTAssertEqual(CSVDelimiter.guessed(string: "header;"), .semicolon)
XCTAssertEqual(CSVDelimiter.guessed(string: "id;name;age"), .semicolon)
XCTAssertEqual(CSVDelimiter.guessed(string: #""a";"b";"c""#), .semicolon)
XCTAssertEqual(CSVDelimiter.guessed(string: #""a,";"b\t";"c""#), .semicolon,
"Prioritizes separator between quotations over first occurrence")
XCTAssertEqual(CSVDelimiter.guessed(string: """
"Test";"Test_1"
"Test";"Test_2"
"""), .semicolon)
}
func testGuessDelimiter_Tab() throws {
XCTAssertEqual(CSVDelimiter.guessed(string: "header\t"), .tab)
XCTAssertEqual(CSVDelimiter.guessed(string: "id\tname\tage"), .tab)
// We cannot use #"..."# string delimiters here because \t doesn't work inside these.
XCTAssertEqual(CSVDelimiter.guessed(string: "\"a\"\t\"b\"\t\"c\""), .tab)
XCTAssertEqual(CSVDelimiter.guessed(string: "\"a,\"\t\"b;\"\t\"c\""), .tab,
"Prioritizes separator between quotations over first occurrence")
}
func testGuessDelimiter_IgnoresEmptyLeadingLines() throws {
XCTAssertEqual(CSVDelimiter.guessed(string: "\na,b,c"), .comma)
XCTAssertEqual(CSVDelimiter.guessed(string: "\n\n\na,b,c"), .comma)
XCTAssertEqual(CSVDelimiter.guessed(string: "\n \n \na,b,c"), .comma)
XCTAssertEqual(CSVDelimiter.guessed(string: "\na;b;c"), .semicolon)
XCTAssertEqual(CSVDelimiter.guessed(string: "\n \n \na;b;c"), .semicolon)
XCTAssertEqual(CSVDelimiter.guessed(string: "\na\tb\tc"), .tab)
XCTAssertEqual(CSVDelimiter.guessed(string: "\n \n \na\tb\tc"), .tab)
}
func testInitWithGuessedDelimiter() throws {
let semicolonCSV = try NamedCSV(string: "id;name;age\n1;Alice;18\n2;Bob;19\n3;Charlie")
let expectedSemicolonCSV = [
["id": "1", "name": "Alice", "age": "18"],
["id": "2", "name": "Bob", "age": "19"],
["id": "3", "name": "Charlie", "age": ""]
]
for (index, row) in semicolonCSV.rows.enumerated() {
XCTAssertEqual(expectedSemicolonCSV[index], row)
}
let tabCSV = try NamedCSV(string: "id\tname\tage\n1\tAlice\t18\n2\tBob\t19\n3\tCharlie")
let expectedTabCSV = [
["id": "1", "name": "Alice", "age": "18"],
["id": "2", "name": "Bob", "age": "19"],
["id": "3", "name": "Charlie", "age": ""]
]
for (index, row) in tabCSV.rows.enumerated() {
XCTAssertEqual(expectedTabCSV[index], row)
}
}
}
================================================
FILE: SwiftCSVTests/CSVDelimiterTests.swift
================================================
//
// CSVDelimiterTests.swift
// SwiftCSV
//
// Created by Christian Tietze on 21.12.21.
// Copyright © 2021 SwiftCSV. All rights reserved.
//
import XCTest
@testable import SwiftCSV
class CSVDelimiterTests: XCTestCase {
func testRawValue() {
XCTAssertEqual(CSVDelimiter.comma.rawValue, ",")
XCTAssertEqual(CSVDelimiter.semicolon.rawValue, ";")
XCTAssertEqual(CSVDelimiter.tab.rawValue, "\t")
XCTAssertEqual(CSVDelimiter.character("x").rawValue, "x")
}
func testLiteralInitializer() {
XCTAssertEqual(CSVDelimiter.comma, ",")
XCTAssertEqual(CSVDelimiter.semicolon, ";")
XCTAssertEqual(CSVDelimiter.tab, "\t")
XCTAssertEqual(CSVDelimiter.character("x"), "x")
}
}
================================================
FILE: SwiftCSVTests/EnumeratedCSVViewTests.swift
================================================
//
// EnumeratedViewTests.swift
// SwiftCSV
//
// Created by Christian Tietze on 2016-10-25.
// Copyright © 2016 Naoto Kaneko. All rights reserved.
//
import XCTest
@testable import SwiftCSV
class EnumeratedViewTests: XCTestCase {
let string = "id,name,age\n1,Alice,18\n2,Bob,19\n3,Charlie,20"
var csv: CSV<Enumerated>!
override func setUpWithError() throws {
csv = try CSV<Enumerated>(string: string, delimiter: ",", loadColumns: true)
}
override func tearDownWithError() throws {
csv = nil
}
func testRows() {
let expected = [
["1", "Alice", "18"],
["2", "Bob", "19"],
["3", "Charlie", "20"]
]
XCTAssertEqual(csv.rows, expected)
}
func testRows_WithLimit() throws {
csv = try CSV<Enumerated>(string: string, delimiter: ",", rowLimit: 2)
let expected = [
["1", "Alice", "18"],
["2", "Bob", "19"]
]
XCTAssertEqual(csv.rows, expected)
}
func testColumns() {
let expected = [
Enumerated.Column(header: "id", rows: ["1", "2", "3"]),
Enumerated.Column(header: "name", rows: ["Alice", "Bob", "Charlie"]),
Enumerated.Column(header: "age", rows: ["18", "19", "20"])
]
XCTAssertEqual(csv.columns, expected)
}
func testColumns_WithLimit() throws {
csv = try CSV<Enumerated>(string: string, delimiter: ",", rowLimit: 2)
let expected = [
Enumerated.Column(header: "id", rows: ["1", "2"]),
Enumerated.Column(header: "name", rows: ["Alice", "Bob"]),
Enumerated.Column(header: "age", rows: ["18", "19"])
]
XCTAssertEqual(csv.columns, expected)
}
func testFillsIncompleteRows() throws {
csv = try CSV<Enumerated>(string: "id,name,age\n1,Alice,18\n2\n3,Charlie", delimiter: ",", loadColumns: true)
let expectedRows = [
["1", "Alice", "18"],
["2", "", ""],
["3", "Charlie", ""]
]
XCTAssertEqual(csv.rows, expectedRows)
let expectedColumns = [
Enumerated.Column(header: "id", rows: ["1", "2", "3"]),
Enumerated.Column(header: "name", rows: ["Alice", "", "Charlie"]),
Enumerated.Column(header: "age", rows: ["18", "", ""])
]
XCTAssertEqual(csv.columns, expectedColumns)
}
func testSerialization() throws {
// Comma-separated values.
XCTAssertEqual(csv.serialized, "id,name,age\n1,Alice,18\n2,Bob,19\n3,Charlie,20")
// Comma-separated values with double quotes and embedded delimiters in cells.
csv = try CSV<Enumerated>(string: "id,\"the, name\",age\n1,\"Alice, In, Wonderland\",18\n2,Bob,19\n3,Charlie,20")
XCTAssertEqual(csv.serialized, "id,\"the, name\",age\n1,\"Alice, In, Wonderland\",18\n2,Bob,19\n3,Charlie,20")
// Tab-separated values with implicit delimiter (delimiter guessing).
csv = try CSV<Enumerated>(string: "id\tname\tage\n1\tAlice\t18\n2\tBob\t19\n3\tCharlie\t20")
XCTAssertEqual(csv.serialized, "id\tname\tage\n1\tAlice\t18\n2\tBob\t19\n3\tCharlie\t20")
// Tab-separated values with double quotes and embedded delimiters in cells.
csv = try CSV<Enumerated>(string: "id\t\"the\t name\"\tage\n1\t\"Alice\t In\t Wonderland\"\t18\n2\tBob\t19\n3\tCharlie\t20")
XCTAssertEqual(csv.serialized, "id\t\"the\t name\"\tage\n1\t\"Alice\t In\t Wonderland\"\t18\n2\tBob\t19\n3\tCharlie\t20")
// Tab-separated values with explicit alternate delimiter (tab) and embedded default delimiters (commas) in cells.
csv = try CSV<Enumerated>(string: "id\tthe, name,age\n1\tAlice, In, Wonderland\t18\n2\tBob\t19\n3\tCharlie\t20", delimiter: .tab)
XCTAssertEqual(csv.serialized, "id\tthe, name,age\n1\tAlice, In, Wonderland\t18\n2\tBob\t19\n3\tCharlie\t20")
}
}
================================================
FILE: SwiftCSVTests/NamedCSVViewTests.swift
================================================
//
// NamedViewTests.swift
// CSVTests
//
// Created by naoty on 2014/06/09.
// Copyright (c) 2014年 Naoto Kaneko. All rights reserved.
//
import XCTest
@testable import SwiftCSV
class NamedViewTests: XCTestCase {
let string = "id,name,age\n1,Alice,18\n2,Bob,19\n3,Charlie,20"
var csv: CSV<Named>!
override func setUpWithError() throws {
csv = try CSV<Named>(string: string)
}
override func tearDownWithError() throws {
csv = nil
}
func testHeader() {
XCTAssertEqual(csv.header, ["id", "name", "age"])
}
func testRows() {
let expected = [
["id": "1", "name": "Alice", "age": "18"],
["id": "2", "name": "Bob", "age": "19"],
["id": "3", "name": "Charlie", "age": "20"]
]
XCTAssertEqual(csv.rows, expected)
}
func testRows_WithLimit() throws {
csv = try CSV<Named>(string: string, delimiter: ",", rowLimit: 2)
let expected = [
["id": "1", "name": "Alice", "age": "18"],
["id": "2", "name": "Bob", "age": "19"],
]
XCTAssertEqual(csv.rows, expected)
}
func testColumns() {
let expected = [
"id": ["1", "2", "3"],
"name": ["Alice", "Bob", "Charlie"],
"age": ["18", "19", "20"]
]
XCTAssertEqual(csv.columns, expected)
}
func testColumns_WithLimit() throws {
csv = try CSV<Named>(string: string, delimiter: ",", rowLimit: 2)
let expected = [
"id": ["1", "2"],
"name": ["Alice", "Bob"],
"age": ["18", "19"]
]
XCTAssertEqual(csv.columns, expected)
}
func testFillsIncompleteRows() throws {
csv = try CSV<Named>(string: "id,name,age\n1,Alice,18\n2,,19\n3,Charlie")
let expectedRows = [
["id": "1", "name": "Alice", "age": "18"],
["id": "2", "name": "", "age": "19"],
["id": "3", "name": "Charlie", "age": ""]
]
XCTAssertEqual(csv.rows, expectedRows)
let expectedColumns = [
"id": ["1", "2", "3"],
"name": ["Alice", "", "Charlie"],
"age": ["18", "19", ""]
]
XCTAssertEqual(csv.columns, expectedColumns)
}
func testSerialization() {
XCTAssertEqual(csv.serialized, "id,name,age\n1,Alice,18\n2,Bob,19\n3,Charlie,20")
}
func testSerializationWithDoubleQuotes() throws {
csv = try CSV<Named>(string: "id,\"the, name\",age\n1,\"Alice, In, Wonderland\",18\n2,Bob,19\n3,Charlie,20")
XCTAssertEqual(csv.serialized, "id,\"the, name\",age\n1,\"Alice, In, Wonderland\",18\n2,Bob,19\n3,Charlie,20")
}
func testEnumerate() throws {
let expected = [
["id": "1", "name": "Alice", "age": "18"],
["id": "2", "name": "Bob", "age": "19"],
["id": "3", "name": "Charlie", "age": "20"]
]
var index = 0
try csv.enumerateAsDict { row in
XCTAssertEqual(row, expected[index])
index += 1
}
}
func testIgnoreColumns() throws {
csv = try CSV<Named>(string: "id,name,age\n1,Alice,18\n2,Bob,19\n3,Charlie,20", delimiter: ",", loadColumns: false)
XCTAssertNil(csv.columns)
let expected = [
["id": "1", "name": "Alice", "age": "18"],
["id": "2", "name": "Bob", "age": "19"],
["id": "3", "name": "Charlie", "age": "20"]
]
for (index, row) in csv.rows.enumerated() {
XCTAssertEqual(expected[index], row)
}
}
func testInit_ParseCommaSeparatedFileWithQuotesAndWhitespaces() throws {
let tab = "\t"
let paragraphSeparator = "\u{2029}"
let ideographicSpace = "\u{3000}"
let failingCsv = """
"a" \(tab) , \(paragraphSeparator) "b"
"A" \(ideographicSpace) , \(tab) "B"
"""
let csv = try CSV<Named>(string: failingCsv, delimiter: .comma)
XCTAssertEqual(csv.rows, [["b": "B", "a": "A"]])
XCTAssertThrowsError(try CSV<Named>(string: failingCsv),
"Delimiter guessing should fail here.")
}
}
================================================
FILE: SwiftCSVTests/NewlineTests.swift
================================================
//
// NewlineTests.swift
// SwiftCSV
//
// Created by Christian Tietze on 05/12/16.
// Copyright © 2016 Naoto Kaneko. All rights reserved.
//
import XCTest
@testable import SwiftCSV
class NewlineTests: XCTestCase {
func testInit_withCR() throws {
let csv = try CSV<Named>(string: "id,name,age\r1,Alice,18\r2,Bob,19\r3,Charlie,20")
XCTAssertEqual(csv.header, ["id", "name", "age"])
let expectedRows = [
["id": "1", "name": "Alice", "age": "18"],
["id": "2", "name": "Bob", "age": "19"],
["id": "3", "name": "Charlie", "age": "20"]
]
for (index, row) in csv.rows.enumerated() {
XCTAssertEqual(expectedRows[index], row)
}
}
func testInit_withLF() throws {
let csv = try CSV<Named>(string: "id,name,age\n1,Alice,18\n2,Bob,19\n3,Charlie,20")
XCTAssertEqual(csv.header, ["id", "name", "age"])
let expectedRows = [
["id": "1", "name": "Alice", "age": "18"],
["id": "2", "name": "Bob", "age": "19"],
["id": "3", "name": "Charlie", "age": "20"]
]
for (index, row) in csv.rows.enumerated() {
XCTAssertEqual(expectedRows[index], row)
}
}
func testInit_withCRLF() throws {
let csv = try CSV<Named>(string: "id,name,age\r\n1,Alice,18\r\n2,Bob,19\r\n3,Charlie,20")
XCTAssertEqual(csv.header, ["id", "name", "age"])
let expectedRows = [
["id": "1", "name": "Alice", "age": "18"],
["id": "2", "name": "Bob", "age": "19"],
["id": "3", "name": "Charlie", "age": "20"]
]
for (index, row) in csv.rows.enumerated() {
XCTAssertEqual(expectedRows[index], row)
}
}
func testInit_whenThereIsExtraCarriageReturnAtTheEnd() throws {
let csv = try CSV<Named>(string: "id,name,age\n1,Alice,18\n2,Bob,19\n3,Charlie\r\n")
let expected = [
["id": "1", "name": "Alice", "age": "18"],
["id": "2", "name": "Bob", "age": "19"],
["id": "3", "name": "Charlie", "age": ""]
]
for (index, row) in csv.rows.enumerated() {
XCTAssertEqual(expected[index], row)
}
}
}
================================================
FILE: SwiftCSVTests/ParserTests.swift
================================================
//
// ParserTests.swift
// SwiftCSV
//
// Created by Christian Tietze on 22.11.21.
// Copyright © 2021 Naoto Kaneko. All rights reserved.
//
import XCTest
@testable import SwiftCSV
class ParserTests: XCTestCase {
func testParseArray_RowLimitAndOffset() throws {
let string = "id,name\n1,foo\n2,bar\n3,baz"
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 1, rowLimit: nil),
[["1","foo"], ["2","bar"], ["3","baz"]])
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 2, rowLimit: nil),
[["2","bar"], ["3","baz"]])
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 3, rowLimit: nil),
[["3","baz"]])
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 4, rowLimit: nil),
[])
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 0, rowLimit: nil),
[["id","name"], ["1","foo"], ["2","bar"], ["3","baz"]])
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 0, rowLimit: -1),
[["id","name"], ["1","foo"], ["2","bar"], ["3","baz"]])
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 0, rowLimit: 0),
[])
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 0, rowLimit: 1),
[["id","name"]])
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 0, rowLimit: 2),
[["id","name"], ["1","foo"]])
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 0, rowLimit: 3),
[["id","name"], ["1","foo"], ["2","bar"]])
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 0, rowLimit: 4),
[["id","name"], ["1","foo"], ["2","bar"], ["3","baz"]])
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 0, rowLimit: 5),
[["id","name"], ["1","foo"], ["2","bar"], ["3","baz"]])
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 0, rowLimit: 999),
[["id","name"], ["1","foo"], ["2","bar"], ["3","baz"]])
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 1, rowLimit: 1),
[["1","foo"]])
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 1, rowLimit: 2),
[["1","foo"], ["2","bar"]])
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 2, rowLimit: 1),
[["2","bar"]])
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 2, rowLimit: 2),
[["2","bar"], ["3","baz"]])
XCTAssertEqual(try Parser.array(text: string, delimiter: ",", startAt: 5, rowLimit: 1),
[])
}
}
================================================
FILE: SwiftCSVTests/PerformanceTest.swift
================================================
//
// PerformanceTest.swift
// SwiftCSV
//
// Created by 杉本裕樹 on 2016/04/23.
// Copyright © 2016年 Naoto Kaneko. All rights reserved.
//
import XCTest
@testable import SwiftCSV
class PerformanceTest: XCTestCase {
var csv: CSV<Named>!
override func setUpWithError() throws {
let testFilePath = "TestData/large"
let testFileExtension = "csv"
guard let csvURL = ResourceHelper.url(forResource: testFilePath, withExtension: testFileExtension) else {
XCTAssertNotNil(nil, "Could not get URL for \(testFilePath).\(testFileExtension) from Test Bundle")
return
}
csv = try CSV<Named>(url: csvURL)
}
func testParsePerformance() {
measure {
_ = self.csv.rows
}
}
}
================================================
FILE: SwiftCSVTests/QuotedTests.swift
================================================
//
// QuotedTests.swift
// SwiftCSV
//
// Created by Will Richardson on 7/04/16.
// Copyright © 2016 Naoto Kaneko. All rights reserved.
//
import XCTest
import SwiftCSV
class QuotedTests: XCTestCase {
var csv: CSV<Named>!
override func setUpWithError() throws {
csv = try CSV<Named>(string: "id,\"name, person\",age\n\"5\",\"Smith, John\",67\n8,Joe Bloggs,\"8\"")
}
func testQuotedHeader() {
XCTAssertEqual(csv.header, ["id", "name, person", "age"])
}
func testQuotedContent() {
let cols = csv.rows
XCTAssertEqual(cols[0], [
"id": "5",
"name, person": "Smith, John",
"age": "67"
])
XCTAssertEqual(cols[1], [
"id": "8",
"name, person": "Joe Bloggs",
"age": "8"
])
}
func testEmbeddedQuotes() throws {
let testFilePath = "TestData/wonderland"
let testFileExtension = "csv"
guard let csvURL = ResourceHelper.url(forResource: testFilePath, withExtension: testFileExtension) else {
XCTAssertNotNil(nil, "Could not get URL for \(testFilePath).\(testFileExtension) from Test Bundle")
return
}
csv = try CSV(url: csvURL)
/*
The test file:
Character,Quote
White Rabbit,"""Where shall I begin, please your Majesty?"" he asked."
King,"""Begin at the beginning,"" the King said gravely, ""and go on till you come to the end: then stop."""
March Hare,"""Do you mean that you think you can find out the answer to it?"" said the March Hare."
Notice there are no commas (delimiters) in the 3rd line.
For more information, see https://www.rfc-editor.org/rfc/rfc4180.html
*/
let expected = [
[ "Character" : "White Rabbit" , "Quote" : #""Where shall I begin, please your Majesty?" he asked."# ],
[ "Character" : "King" , "Quote" : #""Begin at the beginning," the King said gravely, "and go on till you come to the end: then stop.""# ],
[ "Character" : "March Hare" , "Quote" : #""Do you mean that you think you can find out the answer to it?" said the March Hare."# ]
]
for (index, row) in csv.rows.enumerated() {
XCTAssertEqual(expected[index], row)
}
let serialized = csv.serialized
let read = try String(contentsOf: csvURL, encoding: .utf8)
XCTAssertEqual(serialized, read)
}
}
================================================
FILE: SwiftCSVTests/ResourceHelper.swift
================================================
import Foundation
// Find url of resource.
// This is a workaround for Xcode, when testing from the Xcode project (not the SPM package) bundle.module is not available...
struct ResourceHelper {
static func url(forResource name: String, withExtension type: String) -> URL? {
#if SWIFT_PACKAGE
return Bundle.module.url(forResource: name, withExtension: type)
#else
// Xcode project
let bundle = Bundle(for: NamedViewTests.self)
// In Xcode, folders are stripped from the resources folder.
var finalName = name
var slashCharSet = CharacterSet()
slashCharSet.insert("/")
let parts = name.components(separatedBy: slashCharSet)
if parts.count > 1 {
finalName = parts.last!
}
return bundle.url(forResource: finalName, withExtension: type)
#endif
}
}
================================================
FILE: SwiftCSVTests/TSVTests.swift
================================================
//
// TSVTests.swift
// SwiftCSV
//
// Created by naoty on 2014/06/15.
// Copyright (c) 2014年 Naoto Kaneko. All rights reserved.
//
import XCTest
import Foundation
@testable import SwiftCSV
class TSVTests: XCTestCase {
var tsv: CSV<Named>!
override func setUpWithError() throws {
tsv = try CSV<Named>(string: "id\tname\tage\n1\tAlice\t18\n2\tBob\t19\n3\tCharlie\t20", delimiter: "\t")
}
func testInit_makesHeader() {
XCTAssertEqual(tsv.header, ["id", "name", "age"])
}
func testInit_makesRows() {
let expected = [
["id": "1", "name": "Alice", "age": "18"],
["id": "2", "name": "Bob", "age": "19"],
["id": "3", "name": "Charlie", "age": "20"]
]
for (index, row) in tsv.rows.enumerated() {
XCTAssertEqual(expected[index], row)
}
}
func testInit_makesColumns() throws {
let expected = [
"id": ["1", "2", "3"],
"name": ["Alice", "Bob", "Charlie"],
"age": ["18", "19", "20"]
]
XCTAssertEqual(
Set(try XCTUnwrap(tsv.columns).keys),
Set(expected.keys))
for (key, value) in try XCTUnwrap(tsv.columns) {
XCTAssertEqual(expected[key] ?? [], value)
}
}
}
================================================
FILE: SwiftCSVTests/TestData/empty_fields.csv
================================================
id,name,age
1,John,23
2,James,32
3,,
6
,Tom
================================================
FILE: SwiftCSVTests/TestData/large.csv
================================================
id,name,age,job
1,name1,20,job1
2,name2,20,job2
3,name3,20,job3
4,name4,20,job4
5,name5,20,job5
6,name6,20,job6
7,name7,20,job7
8,name8,20,job8
9,name9,20,job9
10,name10,20,job10
11,name11,20,job11
12,name12,20,job12
13,name13,20,job13
14,name14,20,job14
15,name15,20,job15
16,name16,20,job16
17,name17,20,job17
18,name18,20,job18
19,name19,20,job19
20,name20,20,job20
21,name21,20,job21
22,name22,20,job22
23,name23,20,job23
24,name24,20,job24
25,name25,20,job25
26,name26,20,job26
27,name27,20,job27
28,name28,20,job28
29,name29,20,job29
30,name30,20,job30
31,name31,20,job31
32,name32,20,job32
33,name33,20,job33
34,name34,20,job34
35,name35,20,job35
36,name36,20,job36
37,name37,20,job37
38,name38,20,job38
39,name39,20,job39
40,name40,20,job40
41,name41,20,job41
42,name42,20,job42
43,name43,20,job43
44,name44,20,job44
45,name45,20,job45
46,name46,20,job46
47,name47,20,job47
48,name48,20,job48
49,name49,20,job49
50,name50,20,job50
51,name51,20,job51
52,name52,20,job52
53,name53,20,job53
54,name54,20,job54
55,name55,20,job55
56,name56,20,job56
57,name57,20,job57
58,name58,20,job58
59,name59,20,job59
60,name60,20,job60
61,name61,20,job61
62,name62,20,job62
63,name63,20,job63
64,name64,20,job64
65,name65,20,job65
66,name66,20,job66
67,name67,20,job67
68,name68,20,job68
69,name69,20,job69
70,name70,20,job70
71,name71,20,job71
72,name72,20,job72
73,name73,20,job73
74,name74,20,job74
75,name75,20,job75
76,name76,20,job76
77,name77,20,job77
78,name78,20,job78
79,name79,20,job79
80,name80,20,job80
81,name81,20,job81
82,name82,20,job82
83,name83,20,job83
84,name84,20,job84
85,name85,20,job85
86,name86,20,job86
87,name87,20,job87
88,name88,20,job88
89,name89,20,job89
90,name90,20,job90
91,name91,20,job91
92,name92,20,job92
93,name93,20,job93
94,name94,20,job94
95,name95,20,job95
96,name96,20,job96
97,name97,20,job97
98,name98,20,job98
99,name99,20,job99
100,name100,20,job100
101,name101,20,job101
102,name102,20,job102
103,name103,20,job103
104,name104,20,job104
105,name105,20,job105
106,name106,20,job106
107,name107,20,job107
108,name108,20,job108
109,name109,20,job109
110,name110,20,job110
111,name111,20,job111
112,name112,20,job112
113,name113,20,job113
114,name114,20,job114
115,name115,20,job115
116,name116,20,job116
117,name117,20,job117
118,name118,20,job118
119,name119,20,job119
120,name120,20,job120
121,name121,20,job121
122,name122,20,job122
123,name123,20,job123
124,name124,20,job124
125,name125,20,job125
126,name126,20,job126
127,name127,20,job127
128,name128,20,job128
129,name129,20,job129
130,name130,20,job130
131,name131,20,job131
132,name132,20,job132
133,name133,20,job133
134,name134,20,job134
135,name135,20,job135
136,name136,20,job136
137,name137,20,job137
138,name138,20,job138
139,name139,20,job139
140,name140,20,job140
141,name141,20,job141
142,name142,20,job142
143,name143,20,job143
144,name144,20,job144
145,name145,20,job145
146,name146,20,job146
147,name147,20,job147
148,name148,20,job148
149,name149,20,job149
150,name150,20,job150
151,name151,20,job151
152,name152,20,job152
153,name153,20,job153
154,name154,20,job154
155,name155,20,job155
156,name156,20,job156
157,name157,20,job157
158,name158,20,job158
159,name159,20,job159
160,name160,20,job160
161,name161,20,job161
162,name162,20,job162
163,name163,20,job163
164,name164,20,job164
165,name165,20,job165
166,name166,20,job166
167,name167,20,job167
168,name168,20,job168
169,name169,20,job169
170,name170,20,job170
171,name171,20,job171
172,name172,20,job172
173,name173,20,job173
174,name174,20,job174
175,name175,20,job175
176,name176,20,job176
177,name177,20,job177
178,name178,20,job178
179,name179,20,job179
180,name180,20,job180
181,name181,20,job181
182,name182,20,job182
183,name183,20,job183
184,name184,20,job184
185,name185,20,job185
186,name186,20,job186
187,name187,20,job187
188,name188,20,job188
189,name189,20,job189
190,name190,20,job190
191,name191,20,job191
192,name192,20,job192
193,name193,20,job193
194,name194,20,job194
195,name195,20,job195
196,name196,20,job196
197,name197,20,job197
198,name198,20,job198
199,name199,20,job199
200,name200,20,job200
201,name201,20,job201
202,name202,20,job202
203,name203,20,job203
204,name204,20,job204
205,name205,20,job205
206,name206,20,job206
207,name207,20,job207
208,name208,20,job208
209,name209,20,job209
210,name210,20,job210
211,name211,20,job211
212,name212,20,job212
213,name213,20,job213
214,name214,20,job214
215,name215,20,job215
216,name216,20,job216
217,name217,20,job217
218,name218,20,job218
219,name219,20,job219
220,name220,20,job220
221,name221,20,job221
222,name222,20,job222
223,name223,20,job223
224,name224,20,job224
225,name225,20,job225
226,name226,20,job226
227,name227,20,job227
228,name228,20,job228
229,name229,20,job229
230,name230,20,job230
231,name231,20,job231
232,name232,20,job232
233,name233,20,job233
234,name234,20,job234
235,name235,20,job235
236,name236,20,job236
237,name237,20,job237
238,name238,20,job238
239,name239,20,job239
240,name240,20,job240
241,name241,20,job241
242,name242,20,job242
243,name243,20,job243
244,name244,20,job244
245,name245,20,job245
246,name246,20,job246
247,name247,20,job247
248,name248,20,job248
249,name249,20,job249
250,name250,20,job250
251,name251,20,job251
252,name252,20,job252
253,name253,20,job253
254,name254,20,job254
255,name255,20,job255
256,name256,20,job256
257,name257,20,job257
258,name258,20,job258
259,name259,20,job259
260,name260,20,job260
261,name261,20,job261
262,name262,20,job262
263,name263,20,job263
264,name264,20,job264
265,name265,20,job265
266,name266,20,job266
267,name267,20,job267
268,name268,20,job268
269,name269,20,job269
270,name270,20,job270
271,name271,20,job271
272,name272,20,job272
273,name273,20,job273
274,name274,20,job274
275,name275,20,job275
276,name276,20,job276
277,name277,20,job277
278,name278,20,job278
279,name279,20,job279
280,name280,20,job280
281,name281,20,job281
282,name282,20,job282
283,name283,20,job283
284,name284,20,job284
285,name285,20,job285
286,name286,20,job286
287,name287,20,job287
288,name288,20,job288
289,name289,20,job289
290,name290,20,job290
291,name291,20,job291
292,name292,20,job292
293,name293,20,job293
294,name294,20,job294
295,name295,20,job295
296,name296,20,job296
297,name297,20,job297
298,name298,20,job298
299,name299,20,job299
300,name300,20,job300
301,name301,20,job301
302,name302,20,job302
303,name303,20,job303
304,name304,20,job304
305,name305,20,job305
306,name306,20,job306
307,name307,20,job307
308,name308,20,job308
309,name309,20,job309
310,name310,20,job310
311,name311,20,job311
312,name312,20,job312
313,name313,20,job313
314,name314,20,job314
315,name315,20,job315
316,name316,20,job316
317,name317,20,job317
318,name318,20,job318
319,name319,20,job319
320,name320,20,job320
321,name321,20,job321
322,name322,20,job322
323,name323,20,job323
324,name324,20,job324
325,name325,20,job325
326,name326,20,job326
327,name327,20,job327
328,name328,20,job328
329,name329,20,job329
330,name330,20,job330
331,name331,20,job331
332,name332,20,job332
333,name333,20,job333
334,name334,20,job334
335,name335,20,job335
336,name336,20,job336
337,name337,20,job337
338,name338,20,job338
339,name339,20,job339
340,name340,20,job340
341,name341,20,job341
342,name342,20,job342
343,name343,20,job343
344,name344,20,job344
345,name345,20,job345
346,name346,20,job346
347,name347,20,job347
348,name348,20,job348
349,name349,20,job349
350,name350,20,job350
351,name351,20,job351
352,name352,20,job352
353,name353,20,job353
354,name354,20,job354
355,name355,20,job355
356,name356,20,job356
357,name357,20,job357
358,name358,20,job358
359,name359,20,job359
360,name360,20,job360
361,name361,20,job361
362,name362,20,job362
363,name363,20,job363
364,name364,20,job364
365,name365,20,job365
366,name366,20,job366
367,name367,20,job367
368,name368,20,job368
369,name369,20,job369
370,name370,20,job370
371,name371,20,job371
372,name372,20,job372
373,name373,20,job373
374,name374,20,job374
375,name375,20,job375
376,name376,20,job376
377,name377,20,job377
378,name378,20,job378
379,name379,20,job379
380,name380,20,job380
381,name381,20,job381
382,name382,20,job382
383,name383,20,job383
384,name384,20,job384
385,name385,20,job385
386,name386,20,job386
387,name387,20,job387
388,name388,20,job388
389,name389,20,job389
390,name390,20,job390
391,name391,20,job391
392,name392,20,job392
393,name393,20,job393
394,name394,20,job394
395,name395,20,job395
396,name396,20,job396
397,name397,20,job397
398,name398,20,job398
399,name399,20,job399
400,name400,20,job400
401,name401,20,job401
402,name402,20,job402
403,name403,20,job403
404,name404,20,job404
405,name405,20,job405
406,name406,20,job406
407,name407,20,job407
408,name408,20,job408
409,name409,20,job409
410,name410,20,job410
411,name411,20,job411
412,name412,20,job412
413,name413,20,job413
414,name414,20,job414
415,name415,20,job415
416,name416,20,job416
417,name417,20,job417
418,name418,20,job418
419,name419,20,job419
420,name420,20,job420
421,name421,20,job421
422,name422,20,job422
423,name423,20,job423
424,name424,20,job424
425,name425,20,job425
426,name426,20,job426
427,name427,20,job427
428,name428,20,job428
429,name429,20,job429
430,name430,20,job430
431,name431,20,job431
432,name432,20,job432
433,name433,20,job433
434,name434,20,job434
435,name435,20,job435
436,name436,20,job436
437,name437,20,job437
438,name438,20,job438
439,name439,20,job439
440,name440,20,job440
441,name441,20,job441
442,name442,20,job442
443,name443,20,job443
444,name444,20,job444
445,name445,20,job445
446,name446,20,job446
447,name447,20,job447
448,name448,20,job448
449,name449,20,job449
450,name450,20,job450
451,name451,20,job451
452,name452,20,job452
453,name453,20,job453
454,name454,20,job454
455,name455,20,job455
456,name456,20,job456
457,name457,20,job457
458,name458,20,job458
459,name459,20,job459
460,name460,20,job460
461,name461,20,job461
462,name462,20,job462
463,name463,20,job463
464,name464,20,job464
465,name465,20,job465
466,name466,20,job466
467,name467,20,job467
468,name468,20,job468
469,name469,20,job469
470,name470,20,job470
471,name471,20,job471
472,name472,20,job472
473,name473,20,job473
474,name474,20,job474
475,name475,20,job475
476,name476,20,job476
477,name477,20,job477
478,name478,20,job478
479,name479,20,job479
480,name480,20,job480
481,name481,20,job481
482,name482,20,job482
483,name483,20,job483
484,name484,20,job484
485,name485,20,job485
486,name486,20,job486
487,name487,20,job487
488,name488,20,job488
489,name489,20,job489
490,name490,20,job490
491,name491,20,job491
492,name492,20,job492
493,name493,20,job493
494,name494,20,job494
495,name495,20,job495
496,name496,20,job496
497,name497,20,job497
498,name498,20,job498
499,name499,20,job499
500,name500,20,job500
501,name501,20,job501
502,name502,20,job502
503,name503,20,job503
504,name504,20,job504
505,name505,20,job505
506,name506,20,job506
507,name507,20,job507
508,name508,20,job508
509,name509,20,job509
510,name510,20,job510
511,name511,20,job511
512,name512,20,job512
513,name513,20,job513
514,name514,20,job514
515,name515,20,job515
516,name516,20,job516
517,name517,20,job517
518,name518,20,job518
519,name519,20,job519
520,name520,20,job520
521,name521,20,job521
522,name522,20,job522
523,name523,20,job523
524,name524,20,job524
525,name525,20,job525
526,name526,20,job526
527,name527,20,job527
528,name528,20,job528
529,name529,20,job529
530,name530,20,job530
531,name531,20,job531
532,name532,20,job532
533,name533,20,job533
534,name534,20,job534
535,name535,20,job535
536,name536,20,job536
537,name537,20,job537
538,name538,20,job538
539,name539,20,job539
540,name540,20,job540
541,name541,20,job541
542,name542,20,job542
543,name543,20,job543
544,name544,20,job544
545,name545,20,job545
546,name546,20,job546
547,name547,20,job547
548,name548,20,job548
549,name549,20,job549
550,name550,20,job550
551,name551,20,job551
552,name552,20,job552
553,name553,20,job553
554,name554,20,job554
555,name555,20,job555
556,name556,20,job556
557,name557,20,job557
558,name558,20,job558
559,name559,20,job559
560,name560,20,job560
561,name561,20,job561
562,name562,20,job562
563,name563,20,job563
564,name564,20,job564
565,name565,20,job565
566,name566,20,job566
567,name567,20,job567
568,name568,20,job568
569,name569,20,job569
570,name570,20,job570
571,name571,20,job571
572,name572,20,job572
573,name573,20,job573
574,name574,20,job574
575,name575,20,job575
576,name576,20,job576
577,name577,20,job577
578,name578,20,job578
579,name579,20,job579
580,name580,20,job580
581,name581,20,job581
582,name582,20,job582
583,name583,20,job583
584,name584,20,job584
585,name585,20,job585
586,name586,20,job586
587,name587,20,job587
588,name588,20,job588
589,name589,20,job589
590,name590,20,job590
591,name591,20,job591
592,name592,20,job592
593,name593,20,job593
594,name594,20,job594
595,name595,20,job595
596,name596,20,job596
597,name597,20,job597
598,name598,20,job598
599,name599,20,job599
600,name600,20,job600
601,name601,20,job601
602,name602,20,job602
603,name603,20,job603
604,name604,20,job604
605,name605,20,job605
606,name606,20,job606
607,name607,20,job607
608,name608,20,job608
609,name609,20,job609
610,name610,20,job610
611,name611,20,job611
612,name612,20,job612
613,name613,20,job613
614,name614,20,job614
615,name615,20,job615
616,name616,20,job616
617,name617,20,job617
618,name618,20,job618
619,name619,20,job619
620,name620,20,job620
621,name621,20,job621
622,name622,20,job622
623,name623,20,job623
624,name624,20,job624
625,name625,20,job625
626,name626,20,job626
627,name627,20,job627
628,name628,20,job628
629,name629,20,job629
630,name630,20,job630
631,name631,20,job631
632,name632,20,job632
633,name633,20,job633
634,name634,20,job634
635,name635,20,job635
636,name636,20,job636
637,name637,20,job637
638,name638,20,job638
639,name639,20,job639
640,name640,20,job640
641,name641,20,job641
642,name642,20,job642
643,name643,20,job643
644,name644,20,job644
645,name645,20,job645
646,name646,20,job646
647,name647,20,job647
648,name648,20,job648
649,name649,20,job649
650,name650,20,job650
651,name651,20,job651
652,name652,20,job652
653,name653,20,job653
654,name654,20,job654
655,name655,20,job655
656,name656,20,job656
657,name657,20,job657
658,name658,20,job658
659,name659,20,job659
660,name660,20,job660
661,name661,20,job661
662,name662,20,job662
663,name663,20,job663
664,name664,20,job664
665,name665,20,job665
666,name666,20,job666
667,name667,20,job667
668,name668,20,job668
669,name669,20,job669
670,name670,20,job670
671,name671,20,job671
672,name672,20,job672
673,name673,20,job673
674,name674,20,job674
675,name675,20,job675
676,name676,20,job676
677,name677,20,job677
678,name678,20,job678
679,name679,20,job679
680,name680,20,job680
681,name681,20,job681
682,name682,20,job682
683,name683,20,job683
684,name684,20,job684
685,name685,20,job685
686,name686,20,job686
687,name687,20,job687
688,name688,20,job688
689,name689,20,job689
690,name690,20,job690
691,name691,20,job691
692,name692,20,job692
693,name693,20,job693
694,name694,20,job694
695,name695,20,job695
696,name696,20,job696
697,name697,20,job697
698,name698,20,job698
699,name699,20,job699
700,name700,20,job700
701,name701,20,job701
702,name702,20,job702
703,name703,20,job703
704,name704,20,job704
705,name705,20,job705
706,name706,20,job706
707,name707,20,job707
708,name708,20,job708
709,name709,20,job709
710,name710,20,job710
711,name711,20,job711
712,name712,20,job712
713,name713,20,job713
714,name714,20,job714
715,name715,20,job715
716,name716,20,job716
717,name717,20,job717
718,name718,20,job718
719,name719,20,job719
720,name720,20,job720
721,name721,20,job721
722,name722,20,job722
723,name723,20,job723
724,name724,20,job724
725,name725,20,job725
726,name726,20,job726
727,name727,20,job727
728,name728,20,job728
729,name729,20,job729
730,name730,20,job730
731,name731,20,job731
732,name732,20,job732
733,name733,20,job733
734,name734,20,job734
735,name735,20,job735
736,name736,20,job736
737,name737,20,job737
738,name738,20,job738
739,name739,20,job739
740,name740,20,job740
741,name741,20,job741
742,name742,20,job742
743,name743,20,job743
744,name744,20,job744
745,name745,20,job745
746,name746,20,job746
747,name747,20,job747
748,name748,20,job748
749,name749,20,job749
750,name750,20,job750
751,name751,20,job751
752,name752,20,job752
753,name753,20,job753
754,name754,20,job754
755,name755,20,job755
756,name756,20,job756
757,name757,20,job757
758,name758,20,job758
759,name759,20,job759
760,name760,20,job760
761,name761,20,job761
762,name762,20,job762
763,name763,20,job763
764,name764,20,job764
765,name765,20,job765
766,name766,20,job766
767,name767,20,job767
768,name768,20,job768
769,name769,20,job769
770,name770,20,job770
771,name771,20,job771
772,name772,20,job772
773,name773,20,job773
774,name774,20,job774
775,name775,20,job775
776,name776,20,job776
777,name777,20,job777
778,name778,20,job778
779,name779,20,job779
780,name780,20,job780
781,name781,20,job781
782,name782,20,job782
783,name783,20,job783
784,name784,20,job784
785,name785,20,job785
786,name786,20,job786
787,name787,20,job787
788,name788,20,job788
789,name789,20,job789
790,name790,20,job790
791,name791,20,job791
792,name792,20,job792
793,name793,20,job793
794,name794,20,job794
795,name795,20,job795
796,name796,20,job796
797,name797,20,job797
798,name798,20,job798
799,name799,20,job799
800,name800,20,job800
801,name801,20,job801
802,name802,20,job802
803,name803,20,job803
804,name804,20,job804
805,name805,20,job805
806,name806,20,job806
807,name807,20,job807
808,name808,20,job808
809,name809,20,job809
810,name810,20,job810
811,name811,20,job811
812,name812,20,job812
813,name813,20,job813
814,name814,20,job814
815,name815,20,job815
816,name816,20,job816
817,name817,20,job817
818,name818,20,job818
819,name819,20,job819
820,name820,20,job820
821,name821,20,job821
822,name822,20,job822
823,name823,20,job823
824,name824,20,job824
825,name825,20,job825
826,name826,20,job826
827,name827,20,job827
828,name828,20,job828
829,name829,20,job829
830,name830,20,job830
831,name831,20,job831
832,name832,20,job832
833,name833,20,job833
834,name834,20,job834
835,name835,20,job835
836,name836,20,job836
837,name837,20,job837
838,name838,20,job838
839,name839,20,job839
840,name840,20,job840
841,name841,20,job841
842,name842,20,job842
843,name843,20,job843
844,name844,20,job844
845,name845,20,job845
846,name846,20,job846
847,name847,20,job847
848,name848,20,job848
849,name849,20,job849
850,name850,20,job850
851,name851,20,job851
852,name852,20,job852
853,name853,20,job853
854,name854,20,job854
855,name855,20,job855
856,name856,20,job856
857,name857,20,job857
858,name858,20,job858
859,name859,20,job859
860,name860,20,job860
861,name861,20,job861
862,name862,20,job862
863,name863,20,job863
864,name864,20,job864
865,name865,20,job865
866,name866,20,job866
867,name867,20,job867
868,name868,20,job868
869,name869,20,job869
870,name870,20,job870
871,name871,20,job871
872,name872,20,job872
873,name873,20,job873
874,name874,20,job874
875,name875,20,job875
876,name876,20,job876
877,name877,20,job877
878,name878,20,job878
879,name879,20,job879
880,name880,20,job880
881,name881,20,job881
882,name882,20,job882
883,name883,20,job883
884,name884,20,job884
885,name885,20,job885
886,name886,20,job886
887,name887,20,job887
888,name888,20,job888
889,name889,20,job889
890,name890,20,job890
891,name891,20,job891
892,name892,20,job892
893,name893,20,job893
894,name894,20,job894
895,name895,20,job895
896,name896,20,job896
897,name897,20,job897
898,name898,20,job898
899,name899,20,job899
900,name900,20,job900
901,name901,20,job901
902,name902,20,job902
903,name903,20,job903
904,name904,20,job904
905,name905,20,job905
906,name906,20,job906
907,name907,20,job907
908,name908,20,job908
909,name909,20,job909
910,name910,20,job910
911,name911,20,job911
912,name912,20,job912
913,name913,20,job913
914,name914,20,job914
915,name915,20,job915
916,name916,20,job916
917,name917,20,job917
918,name918,20,job918
919,name919,20,job919
920,name920,20,job920
921,name921,20,job921
922,name922,20,job922
923,name923,20,job923
924,name924,20,job924
925,name925,20,job925
926,name926,20,job926
927,name927,20,job927
928,name928,20,job928
929,name929,20,job929
930,name930,20,job930
931,name931,20,job931
932,name932,20,job932
933,name933,20,job933
934,name934,20,job934
935,name935,20,job935
936,name936,20,job936
937,name937,20,job937
938,name938,20,job938
939,name939,20,job939
940,name940,20,job940
941,name941,20,job941
942,name942,20,job942
943,name943,20,job943
944,name944,20,job944
945,name945,20,job945
946,name946,20,job946
947,name947,20,job947
948,name948,20,job948
949,name949,20,job949
950,name950,20,job950
951,name951,20,job951
952,name952,20,job952
953,name953,20,job953
954,name954,20,job954
955,name955,20,job955
956,name956,20,job956
957,name957,20,job957
958,name958,20,job958
959,name959,20,job959
960,name960,20,job960
961,name961,20,job961
962,name962,20,job962
963,name963,20,job963
964,name964,20,job964
965,name965,20,job965
966,name966,20,job966
967,name967,20,job967
968,name968,20,job968
969,name969,20,job969
970,name970,20,job970
971,name971,20,job971
972,name972,20,job972
973,name973,20,job973
974,name974,20,job974
975,name975,20,job975
976,name976,20,job976
977,name977,20,job977
978,name978,20,job978
979,name979,20,job979
980,name980,20,job980
981,name981,20,job981
982,name982,20,job982
983,name983,20,job983
984,name984,20,job984
985,name985,20,job985
986,name986,20,job986
987,name987,20,job987
988,name988,20,job988
989,name989,20,job989
990,name990,20,job990
991,name991,20,job991
992,name992,20,job992
993,name993,20,job993
994,name994,20,job994
995,name995,20,job995
996,name996,20,job996
997,name997,20,job997
998,name998,20,job998
999,name999,20,job999
1000,name1000,20,job1000
1001,name1001,20,job1001
1002,name1002,20,job1002
1003,name1003,20,job1003
1004,name1004,20,job1004
1005,name1005,20,job1005
1006,name1006,20,job1006
1007,name1007,20,job1007
1008,name1008,20,job1008
1009,name1009,20,job1009
1010,name1010,20,job1010
1011,name1011,20,job1011
1012,name1012,20,job1012
1013,name1013,20,job1013
1014,name1014,20,job1014
1015,name1015,20,job1015
1016,name1016,20,job1016
1017,name1017,20,job1017
1018,name1018,20,job1018
1019,name1019,20,job1019
1020,name1020,20,job1020
1021,name1021,20,job1021
1022,name1022,20,job1022
1023,name1023,20,job1023
1024,name1024,20,job1024
1025,name1025,20,job1025
1026,name1026,20,job1026
1027,name1027,20,job1027
1028,name1028,20,job1028
1029,name1029,20,job1029
1030,name1030,20,job1030
1031,name1031,20,job1031
1032,name1032,20,job1032
1033,name1033,20,job1033
1034,name1034,20,job1034
1035,name1035,20,job1035
1036,name1036,20,job1036
1037,name1037,20,job1037
1038,name1038,20,job1038
1039,name1039,20,job1039
1040,name1040,20,job1040
1041,name1041,20,job1041
1042,name1042,20,job1042
1043,name1043,20,job1043
1044,name1044,20,job1044
1045,name1045,20,job1045
1046,name1046,20,job1046
1047,name1047,20,job1047
1048,name1048,20,job1048
1049,name1049,20,job1049
1050,name1050,20,job1050
1051,name1051,20,job1051
1052,name1052,20,job1052
1053,name1053,20,job1053
1054,name1054,20,job1054
1055,name1055,20,job1055
1056,name1056,20,job1056
1057,name1057,20,job1057
1058,name1058,20,job1058
1059,name1059,20,job1059
1060,name1060,20,job1060
1061,name1061,20,job1061
1062,name1062,20,job1062
1063,name1063,20,job1063
1064,name1064,20,job1064
1065,name1065,20,job1065
1066,name1066,20,job1066
1067,name1067,20,job1067
1068,name1068,20,job1068
1069,name1069,20,job1069
1070,name1070,20,job1070
1071,name1071,20,job1071
1072,name1072,20,job1072
1073,name1073,20,job1073
1074,name1074,20,job1074
1075,name1075,20,job1075
1076,name1076,20,job1076
1077,name1077,20,job1077
1078,name1078,20,job1078
1079,name1079,20,job1079
1080,name1080,20,job1080
1081,name1081,20,job1081
1082,name1082,20,job1082
1083,name1083,20,job1083
1084,name1084,20,job1084
1085,name1085,20,job1085
1086,name1086,20,job1086
1087,name1087,20,job1087
1088,name1088,20,job1088
1089,name1089,20,job1089
1090,name1090,20,job1090
1091,name1091,20,job1091
1092,name1092,20,job1092
1093,name1093,20,job1093
1094,name1094,20,job1094
1095,name1095,20,job1095
1096,name1096,20,job1096
1097,name1097,20,job1097
1098,name1098,20,job1098
1099,name1099,20,job1099
1100,name1100,20,job1100
1101,name1101,20,job1101
1102,name1102,20,job1102
1103,name1103,20,job1103
1104,name1104,20,job1104
1105,name1105,20,job1105
1106,name1106,20,job1106
1107,name1107,20,job1107
1108,name1108,20,job1108
1109,name1109,20,job1109
1110,name1110,20,job1110
1111,name1111,20,job1111
1112,name1112,20,job1112
1113,name1113,20,job1113
1114,name1114,20,job1114
1115,name1115,20,job1115
1116,name1116,20,job1116
1117,name1117,20,job1117
1118,name1118,20,job1118
1119,name1119,20,job1119
1120,name1120,20,job1120
1121,name1121,20,job1121
1122,name1122,20,job1122
1123,name1123,20,job1123
1124,name1124,20,job1124
1125,name1125,20,job1125
1126,name1126,20,job1126
1127,name1127,20,job1127
1128,name1128,20,job1128
1129,name1129,20,job1129
1130,name1130,20,job1130
1131,name1131,20,job1131
1132,name1132,20,job1132
1133,name1133,20,job1133
1134,name1134,20,job1134
1135,name1135,20,job1135
1136,name1136,20,job1136
1137,name1137,20,job1137
1138,name1138,20,job1138
1139,name1139,20,job1139
1140,name1140,20,job1140
1141,name1141,20,job1141
1142,name1142,20,job1142
1143,name1143,20,job1143
1144,name1144,20,job1144
1145,name1145,20,job1145
1146,name1146,20,job1146
1147,name1147,20,job1147
1148,name1148,20,job1148
1149,name1149,20,job1149
1150,name1150,20,job1150
1151,name1151,20,job1151
1152,name1152,20,job1152
1153,name1153,20,job1153
1154,name1154,20,job1154
1155,name1155,20,job1155
1156,name1156,20,job1156
1157,name1157,20,job1157
1158,name1158,20,job1158
1159,name1159,20,job1159
1160,name1160,20,job1160
1161,name1161,20,job1161
1162,name1162,20,job1162
1163,name1163,20,job1163
1164,name1164,20,job1164
1165,name1165,20,job1165
1166,name1166,20,job1166
1167,name1167,20,job1167
1168,name1168,20,job1168
1169,name1169,20,job1169
1170,name1170,20,job1170
1171,name1171,20,job1171
1172,name1172,20,job1172
1173,name1173,20,job1173
1174,name1174,20,job1174
1175,name1175,20,job1175
1176,name1176,20,job1176
1177,name1177,20,job1177
1178,name1178,20,job1178
1179,name1179,20,job1179
1180,name1180,20,job1180
1181,name1181,20,job1181
1182,name1182,20,job1182
1183,name1183,20,job1183
1184,name1184,20,job1184
1185,name1185,20,job1185
1186,name1186,20,job1186
1187,name1187,20,job1187
1188,name1188,20,job1188
1189,name1189,20,job1189
1190,name1190,20,job1190
1191,name1191,20,job1191
1192,name1192,20,job1192
1193,name1193,20,job1193
1194,name1194,20,job1194
1195,name1195,20,job1195
1196,name1196,20,job1196
1197,name1197,20,job1197
1198,name1198,20,job1198
1199,name1199,20,job1199
1200,name1200,20,job1200
1201,name1201,20,job1201
1202,name1202,20,job1202
1203,name1203,20,job1203
1204,name1204,20,job1204
1205,name1205,20,job1205
1206,name1206,20,job1206
1207,name1207,20,job1207
1208,name1208,20,job1208
1209,name1209,20,job1209
1210,name1210,20,job1210
1211,name1211,20,job1211
1212,name1212,20,job1212
1213,name1213,20,job1213
1214,name1214,20,job1214
1215,name1215,20,job1215
1216,name1216,20,job1216
1217,name1217,20,job1217
1218,name1218,20,job1218
1219,name1219,20,job1219
1220,name1220,20,job1220
1221,name1221,20,job1221
1222,name1222,20,job1222
1223,name1223,20,job1223
1224,name1224,20,job1224
1225,name1225,20,job1225
1226,name1226,20,job1226
1227,name1227,20,job1227
1228,name1228,20,job1228
1229,name1229,20,job1229
1230,name1230,20,job1230
1231,name1231,20,job1231
1232,name1232,20,job1232
1233,name1233,20,job1233
1234,name1234,20,job1234
1235,name1235,20,job1235
1236,name1236,20,job1236
1237,name1237,20,job1237
1238,name1238,20,job1238
1239,name1239,20,job1239
1240,name1240,20,job1240
1241,name1241,20,job1241
1242,name1242,20,job1242
1243,name1243,20,job1243
1244,name1244,20,job1244
1245,name1245,20,job1245
1246,name1246,20,job1246
1247,name1247,20,job1247
1248,name1248,20,job1248
1249,name1249,20,job1249
1250,name1250,20,job1250
1251,name1251,20,job1251
1252,name1252,20,job1252
1253,name1253,20,job1253
1254,name1254,20,job1254
1255,name1255,20,job1255
1256,name1256,20,job1256
1257,name1257,20,job1257
1258,name1258,20,job1258
1259,name1259,20,job1259
1260,name1260,20,job1260
1261,name1261,20,job1261
1262,name1262,20,job1262
1263,name1263,20,job1263
1264,name1264,20,job1264
1265,name1265,20,job1265
1266,name1266,20,job1266
1267,name1267,20,job1267
1268,name1268,20,job1268
1269,name1269,20,job1269
1270,name1270,20,job1270
1271,name1271,20,job1271
1272,name1272,20,job1272
1273,name1273,20,job1273
1274,name1274,20,job1274
1275,name1275,20,job1275
1276,name1276,20,job1276
1277,name1277,20,job1277
1278,name1278,20,job1278
1279,name1279,20,job1279
1280,name1280,20,job1280
1281,name1281,20,job1281
1282,name1282,20,job1282
1283,name1283,20,job1283
1284,name1284,20,job1284
1285,name1285,20,job1285
1286,name1286,20,job1286
1287,name1287,20,job1287
1288,name1288,20,job1288
1289,name1289,20,job1289
1290,name1290,20,job1290
1291,name1291,20,job1291
1292,name1292,20,job1292
1293,name1293,20,job1293
1294,name1294,20,job1294
1295,name1295,20,job1295
1296,name1296,20,job1296
1297,name1297,20,job1297
1298,name1298,20,job1298
1299,name1299,20,job1299
1300,name1300,20,job1300
1301,name1301,20,job1301
1302,name1302,20,job1302
1303,name1303,20,job1303
1304,name1304,20,job1304
1305,name1305,20,job1305
1306,name1306,20,job1306
1307,name1307,20,job1307
1308,name1308,20,job1308
1309,name1309,20,job1309
1310,name1310,20,job1310
1311,name1311,20,job1311
1312,name1312,20,job1312
1313,name1313,20,job1313
1314,name1314,20,job1314
1315,name1315,20,job1315
1316,name1316,20,job1316
1317,name1317,20,job1317
1318,name1318,20,job1318
1319,name1319,20,job1319
1320,name1320,20,job1320
1321,name1321,20,job1321
1322,name1322,20,job1322
1323,name1323,20,job1323
1324,name1324,20,job1324
1325,name1325,20,job1325
1326,name1326,20,job1326
1327,name1327,20,job1327
1328,name1328,20,job1328
1329,name1329,20,job1329
1330,name1330,20,job1330
1331,name1331,20,job1331
1332,name1332,20,job1332
1333,name1333,20,job1333
1334,name1334,20,job1334
1335,name1335,20,job1335
1336,name1336,20,job1336
1337,name1337,20,job1337
1338,name1338,20,job1338
1339,name1339,20,job1339
1340,name1340,20,job1340
1341,name1341,20,job1341
1342,name1342,20,job1342
1343,name1343,20,job1343
1344,name1344,20,job1344
1345,name1345,20,job1345
1346,name1346,20,job1346
1347,name1347,20,job1347
1348,name1348,20,job1348
1349,name1349,20,job1349
1350,name1350,20,job1350
1351,name1351,20,job1351
1352,name1352,20,job1352
1353,name1353,20,job1353
1354,name1354,20,job1354
1355,name1355,20,job1355
1356,name1356,20,job1356
1357,name1357,20,job1357
1358,name1358,20,job1358
1359,name1359,20,job1359
1360,name1360,20,job1360
1361,name1361,20,job1361
1362,name1362,20,job1362
1363,name1363,20,job1363
1364,name1364,20,job1364
1365,name1365,20,job1365
1366,name1366,20,job1366
1367,name1367,20,job1367
1368,name1368,20,job1368
1369,name1369,20,job1369
1370,name1370,20,job1370
1371,name1371,20,job1371
1372,name1372,20,job1372
1373,name1373,20,job1373
1374,name1374,20,job1374
1375,name1375,20,job1375
1376,name1376,20,job1376
1377,name1377,20,job1377
1378,name1378,20,job1378
1379,name1379,20,job1379
1380,name1380,20,job1380
1381,name1381,20,job1381
1382,name1382,20,job1382
1383,name1383,20,job1383
1384,name1384,20,job1384
1385,name1385,20,job1385
1386,name1386,20,job1386
1387,name1387,20,job1387
1388,name1388,20,job1388
1389,name1389,20,job1389
1390,name1390,20,job1390
1391,name1391,20,job1391
1392,name1392,20,job1392
1393,name1393,20,job1393
1394,name1394,20,job1394
1395,name1395,20,job1395
1396,name1396,20,job1396
1397,name1397,20,job1397
1398,name1398,20,job1398
1399,name1399,20,job1399
1400,name1400,20,job1400
1401,name1401,20,job1401
1402,name1402,20,job1402
1403,name1403,20,job1403
1404,name1404,20,job1404
1405,name1405,20,job1405
1406,name1406,20,job1406
1407,name1407,20,job1407
1408,name1408,20,job1408
1409,name1409,20,job1409
1410,name1410,20,job1410
1411,name1411,20,job1411
1412,name1412,20,job1412
1413,name1413,20,job1413
1414,name1414,20,job1414
1415,name1415,20,job1415
1416,name1416,20,job1416
1417,name1417,20,job1417
1418,name1418,20,job1418
1419,name1419,20,job1419
1420,name1420,20,job1420
1421,name1421,20,job1421
1422,name1422,20,job1422
1423,name1423,20,job1423
1424,name1424,20,job1424
1425,name1425,20,job1425
1426,name1426,20,job1426
1427,name1427,20,job1427
1428,name1428,20,job1428
1429,name1429,20,job1429
1430,name1430,20,job1430
1431,name1431,20,job1431
1432,name1432,20,job1432
1433,name1433,20,job1433
1434,name1434,20,job1434
1435,name1435,20,job1435
1436,name1436,20,job1436
1437,name1437,20,job1437
1438,name1438,20,job1438
1439,name1439,20,job1439
1440,name1440,20,job1440
1441,name1441,20,job1441
1442,name1442,20,job1442
1443,name1443,20,job1443
1444,name1444,20,job1444
1445,name1445,20,job1445
1446,name1446,20,job1446
1447,name1447,20,job1447
1448,name1448,20,job1448
1449,name1449,20,job1449
1450,name1450,20,job1450
1451,name1451,20,job1451
1452,name1452,20,job1452
1453,name1453,20,job1453
1454,name1454,20,job1454
1455,name1455,20,job1455
1456,name1456,20,job1456
1457,name1457,20,job1457
1458,name1458,20,job1458
1459,name1459,20,job1459
1460,name1460,20,job1460
1461,name1461,20,job1461
1462,name1462,20,job1462
1463,name1463,20,job1463
1464,name1464,20,job1464
1465,name1465,20,job1465
1466,name1466,20,job1466
1467,name1467,20,job1467
1468,name1468,20,job1468
1469,name1469,20,job1469
1470,name1470,20,job1470
1471,name1471,20,job1471
1472,name1472,20,job1472
1473,name1473,20,job1473
1474,name1474,20,job1474
1475,name1475,20,job1475
1476,name1476,20,job1476
1477,name1477,20,job1477
1478,name1478,20,job1478
1479,name1479,20,job1479
1480,name1480,20,job1480
1481,name1481,20,job1481
1482,name1482,20,job1482
1483,name1483,20,job1483
1484,name1484,20,job1484
1485,name1485,20,job1485
1486,name1486,20,job1486
1487,name1487,20,job1487
1488,name1488,20,job1488
1489,name1489,20,job1489
1490,name1490,20,job1490
1491,name1491,20,job1491
1492,name1492,20,job1492
1493,name1493,20,job1493
1494,name1494,20,job1494
1495,name1495,20,job1495
1496,name1496,20,job1496
1497,name1497,20,job1497
1498,name1498,20,job1498
1499,name1499,20,job1499
1500,name1500,20,job1500
1501,name1501,20,job1501
1502,name1502,20,job1502
1503,name1503,20,job1503
1504,name1504,20,job1504
1505,name1505,20,job1505
1506,name1506,20,job1506
1507,name1507,20,job1507
1508,name1508,20,job1508
1509,name1509,20,job1509
1510,name1510,20,job1510
1511,name1511,20,job1511
1512,name1512,20,job1512
1513,name1513,20,job1513
1514,name1514,20,job1514
1515,name1515,20,job1515
1516,name1516,20,job1516
1517,name1517,20,job1517
1518,name1518,20,job1518
1519,name1519,20,job1519
1520,name1520,20,job1520
1521,name1521,20,job1521
1522,name1522,20,job1522
1523,name1523,20,job1523
1524,name1524,20,job1524
1525,name1525,20,job1525
1526,name1526,20,job1526
1527,name1527,20,job1527
1528,name1528,20,job1528
1529,name1529,20,job1529
1530,name1530,20,job1530
1531,name1531,20,job1531
1532,name1532,20,job1532
1533,name1533,20,job1533
1534,name1534,20,job1534
1535,name1535,20,job1535
1536,name1536,20,job1536
1537,name1537,20,job1537
1538,name1538,20,job1538
1539,name1539,20,job1539
1540,name1540,20,job1540
1541,name1541,20,job1541
1542,name1542,20,job1542
1543,name1543,20,job1543
1544,name1544,20,job1544
1545,name1545,20,job1545
1546,name1546,20,job1546
1547,name1547,20,job1547
1548,name1548,20,job1548
1549,name1549,20,job1549
1550,name1550,20,job1550
1551,name1551,20,job1551
1552,name1552,20,job1552
1553,name1553,20,job1553
1554,name1554,20,job1554
1555,name1555,20,job1555
1556,name1556,20,job1556
1557,name1557,20,job1557
1558,name1558,20,job1558
1559,name1559,20,job1559
1560,name1560,20,job1560
1561,name1561,20,job1561
1562,name1562,20,job1562
1563,name1563,20,job1563
1564,name1564,20,job1564
1565,name1565,20,job1565
1566,name1566,20,job1566
1567,name1567,20,job1567
1568,name1568,20,job1568
1569,name1569,20,job1569
1570,name1570,20,job1570
1571,name1571,20,job1571
1572,name1572,20,job1572
1573,name1573,20,job1573
1574,name1574,20,job1574
1575,name1575,20,job1575
1576,name1576,20,job1576
1577,name1577,20,job1577
1578,name1578,20,job1578
1579,name1579,20,job1579
1580,name1580,20,job1580
1581,name1581,20,job1581
1582,name1582,20,job1582
1583,name1583,20,job1583
1584,name1584,20,job1584
1585,name1585,20,job1585
1586,name1586,20,job1586
1587,name1587,20,job1587
1588,name1588,20,job1588
1589,name1589,20,job1589
1590,name1590,20,job1590
1591,name1591,20,job1591
1592,name1592,20,job1592
1593,name1593,20,job1593
1594,name1594,20,job1594
1595,name1595,20,job1595
1596,name1596,20,job1596
1597,name1597,20,job1597
1598,name1598,20,job1598
1599,name1599,20,job1599
1600,name1600,20,job1600
1601,name1601,20,job1601
1602,name1602,20,job1602
1603,name1603,20,job1603
1604,name1604,20,job1604
1605,name1605,20,job1605
1606,name1606,20,job1606
1607,name1607,20,job1607
1608,name1608,20,job1608
1609,name1609,20,job1609
1610,name1610,20,job1610
1611,name1611,20,job1611
1612,name1612,20,job1612
1613,name1613,20,job1613
1614,name1614,20,job1614
1615,name1615,20,job1615
1616,name1616,20,job1616
1617,name1617,20,job1617
1618,name1618,20,job1618
1619,name1619,20,job1619
1620,name1620,20,job1620
1621,name1621,20,job1621
1622,name1622,20,job1622
1623,name1623,20,job1623
1624,name1624,20,job1624
1625,name1625,20,job1625
1626,name1626,20,job1626
1627,name1627,20,job1627
1628,name1628,20,job1628
1629,name1629,20,job1629
1630,name1630,20,job1630
1631,name1631,20,job1631
1632,name1632,20,job1632
1633,name1633,20,job1633
1634,name1634,20,job1634
1635,name1635,20,job1635
1636,name1636,20,job1636
1637,name1637,20,job1637
1638,name1638,20,job1638
1639,name1639,20,job1639
1640,name1640,20,job1640
1641,name1641,20,job1641
1642,name1642,20,job1642
1643,name1643,20,job1643
1644,name1644,20,job1644
1645,name1645,20,job1645
1646,name1646,20,job1646
1647,name1647,20,job1647
1648,name1648,20,job1648
1649,name1649,20,job1649
1650,name1650,20,job1650
1651,name1651,20,job1651
1652,name1652,20,job1652
1653,name1653,20,job1653
1654,name1654,20,job1654
1655,name1655,20,job1655
1656,name1656,20,job1656
1657,name1657,20,job1657
1658,name1658,20,job1658
1659,name1659,20,job1659
1660,name1660,20,job1660
1661,name1661,20,job1661
1662,name1662,20,job1662
1663,name1663,20,job1663
1664,name1664,20,job1664
1665,name1665,20,job1665
1666,name1666,20,job1666
1667,name1667,20,job1667
1668,name1668,20,job1668
1669,name1669,20,job1669
1670,name1670,20,job1670
1671,name1671,20,job1671
1672,name1672,20,job1672
1673,name1673,20,job1673
1674,name1674,20,job1674
1675,name1675,20,job1675
1676,name1676,20,job1676
1677,name1677,20,job1677
1678,name1678,20,job1678
1679,name1679,20,job1679
1680,name1680,20,job1680
1681,name1681,20,job1681
1682,name1682,20,job1682
1683,name1683,20,job1683
1684,name1684,20,job1684
1685,name1685,20,job1685
1686,name1686,20,job1686
1687,name1687,20,job1687
1688,name1688,20,job1688
1689,name1689,20,job1689
1690,name1690,20,job1690
1691,name1691,20,job1691
1692,name1692,20,job1692
1693,name1693,20,job1693
1694,name1694,20,job1694
1695,name1695,20,job1695
1696,name1696,20,job1696
1697,name1697,20,job1697
1698,name1698,20,job1698
1699,name1699,20,job1699
1700,name1700,20,job1700
1701,name1701,20,job1701
1702,name1702,20,job1702
1703,name1703,20,job1703
1704,name1704,20,job1704
1705,name1705,20,job1705
1706,name1706,20,job1706
1707,name1707,20,job1707
1708,name1708,20,job1708
1709,name1709,20,job1709
1710,name1710,20,job1710
1711,name1711,20,job1711
1712,name1712,20,job1712
1713,name1713,20,job1713
1714,name1714,20,job1714
1715,name1715,20,job1715
1716,name1716,20,job1716
1717,name1717,20,job1717
1718,name1718,20,job1718
1719,name1719,20,job1719
1720,name1720,20,job1720
1721,name1721,20,job1721
1722,name1722,20,job1722
1723,name1723,20,job1723
1724,name1724,20,job1724
1725,name1725,20,job1725
1726,name1726,20,job1726
1727,name1727,20,job1727
1728,name1728,20,job1728
1729,name1729,20,job1729
1730,name1730,20,job1730
1731,name1731,20,job1731
1732,name1732,20,job1732
1733,name1733,20,job1733
1734,name1734,20,job1734
1735,name1735,20,job1735
1736,name1736,20,job1736
1737,name1737,20,job1737
1738,name1738,20,job1738
1739,name1739,20,job1739
1740,name1740,20,job1740
1741,name1741,20,job1741
1742,name1742,20,job1742
1743,name1743,20,job1743
1744,name1744,20,job1744
1745,name1745,20,job1745
1746,name1746,20,job1746
1747,name1747,20,job1747
1748,name1748,20,job1748
1749,name1749,20,job1749
1750,name1750,20,job1750
1751,name1751,20,job1751
1752,name1752,20,job1752
1753,name1753,20,job1753
1754,name1754,20,job1754
1755,name1755,20,job1755
1756,name1756,20,job1756
1757,name1757,20,job1757
1758,name1758,20,job1758
1759,name1759,20,job1759
1760,name1760,20,job1760
1761,name1761,20,job1761
1762,name1762,20,job1762
1763,name1763,20,job1763
1764,name1764,20,job1764
1765,name1765,20,job1765
1766,name1766,20,job1766
1767,name1767,20,job1767
176
gitextract_8pv7pl38/
├── .github/
│ └── workflows/
│ └── swift.yml
├── .gitignore
├── .spi.yml
├── .travis.yml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Configuration/
│ └── Project.xcconfig
├── LICENSE
├── Package.swift
├── README.md
├── SwiftCSV/
│ ├── CSV+DelimiterGuessing.swift
│ ├── CSV.swift
│ ├── CSVDelimiter.swift
│ ├── EnumeratedCSVView.swift
│ ├── NamedCSVView.swift
│ ├── Parser.swift
│ ├── ParsingState.swift
│ ├── Resources/
│ │ └── PrivacyInfo.xcprivacy
│ ├── Serializer.swift
│ └── String+Lines.swift
├── SwiftCSV.podspec
├── SwiftCSV.xcodeproj/
│ ├── SwiftCSV-Info.plist
│ ├── SwiftCSVTests-Info.plist
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata/
│ ├── xcbaselines/
│ │ └── 3D1E59BE1945FFAD001CF760.xcbaseline/
│ │ ├── 210222BF-FF70-4818-9C2E-20B20A9F7F48.plist
│ │ └── Info.plist
│ └── xcschemes/
│ ├── SwiftCSV-iOS.xcscheme
│ ├── SwiftCSV-macOS.xcscheme
│ ├── SwiftCSV-tvOS.xcscheme
│ └── SwiftCSV-watchOS.xcscheme
└── SwiftCSVTests/
├── CSVDelimiterGuessingTests.swift
├── CSVDelimiterTests.swift
├── EnumeratedCSVViewTests.swift
├── NamedCSVViewTests.swift
├── NewlineTests.swift
├── ParserTests.swift
├── PerformanceTest.swift
├── QuotedTests.swift
├── ResourceHelper.swift
├── TSVTests.swift
├── TestData/
│ ├── empty_fields.csv
│ ├── large.csv
│ ├── quotes.csv
│ ├── utf8_with_bom.csv
│ └── wonderland.csv
└── URLTests.swift
Condensed preview — 48 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (448K chars).
[
{
"path": ".github/workflows/swift.yml",
"chars": 269,
"preview": "name: Swift\n\non:\n push:\n branches: [ master ]\n pull_request:\n branches: [ master ]\n\njobs:\n build:\n\n runs-on:"
},
{
"path": ".gitignore",
"chars": 562,
"preview": "# Created by http://www.gitignore.io\n\n### Objective-C ###\n# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default"
},
{
"path": ".spi.yml",
"chars": 71,
"preview": "version: 1\nbuilder:\n configs:\n - documentation_targets: [SwiftCSV]\n"
},
{
"path": ".travis.yml",
"chars": 1862,
"preview": "language: swift\n\nbranches:\n except:\n - gh-pages\n\ninstall:\n - gem install cocoapods --pre -N\n - gem install xcprett"
},
{
"path": "CHANGELOG.md",
"chars": 1957,
"preview": "<!--\n## 0.0.0\n\nAPI Changes:\n\nBugfixes:\n\nOther:\n-->\n\n## Unreleased\n\nAPI Changes:\n\n- Allow `enumerateAsArray` and `enumera"
},
{
"path": "CONTRIBUTING.md",
"chars": 4469,
"preview": "# Contributing to SwiftCSV\n\nPull requests are welcome on the [`master`](https://github.com/swiftcsv/SwiftCSV) branch.\n\nW"
},
{
"path": "Configuration/Project.xcconfig",
"chars": 25,
"preview": "MARKETING_VERSION=0.10.0\n"
},
{
"path": "LICENSE",
"chars": 1122,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2014 Naoto Kaneko.\nCopyright (c) 2019 SwiftCSV Contributors.\n\nPermission is hereby "
},
{
"path": "Package.swift",
"chars": 823,
"preview": "// swift-tools-version: 5.6\n\nimport PackageDescription\n\nlet package = Package(\n name: \"SwiftCSV\",\n platforms: [\n "
},
{
"path": "README.md",
"chars": 6600,
"preview": "# SwiftCSV\n\n[ 2014年 Naoto Kaneko. Al"
},
{
"path": "SwiftCSVTests/NewlineTests.swift",
"chars": 2239,
"preview": "//\n// NewlineTests.swift\n// SwiftCSV\n//\n// Created by Christian Tietze on 05/12/16.\n// Copyright © 2016 Naoto Kaneko"
},
{
"path": "SwiftCSVTests/ParserTests.swift",
"chars": 3045,
"preview": "//\n// ParserTests.swift\n// SwiftCSV\n//\n// Created by Christian Tietze on 22.11.21.\n// Copyright © 2021 Naoto Kaneko."
},
{
"path": "SwiftCSVTests/PerformanceTest.swift",
"chars": 783,
"preview": "//\n// PerformanceTest.swift\n// SwiftCSV\n//\n// Created by 杉本裕樹 on 2016/04/23.\n// Copyright © 2016年 Naoto Kaneko. All "
},
{
"path": "SwiftCSVTests/QuotedTests.swift",
"chars": 2475,
"preview": "//\n// QuotedTests.swift\n// SwiftCSV\n//\n// Created by Will Richardson on 7/04/16.\n// Copyright © 2016 Naoto Kaneko. A"
},
{
"path": "SwiftCSVTests/ResourceHelper.swift",
"chars": 871,
"preview": "import Foundation\n\n// Find url of resource.\n// This is a workaround for Xcode, when testing from the Xcode project (not "
},
{
"path": "SwiftCSVTests/TSVTests.swift",
"chars": 1314,
"preview": "//\n// TSVTests.swift\n// SwiftCSV\n//\n// Created by naoty on 2014/06/15.\n// Copyright (c) 2014年 Naoto Kaneko. All righ"
},
{
"path": "SwiftCSVTests/TestData/empty_fields.csv",
"chars": 44,
"preview": "id,name,age\n1,John,23\n2,James,32\n3,,\n6\n\n,Tom"
},
{
"path": "SwiftCSVTests/TestData/large.csv",
"chars": 256697,
"preview": "id,name,age,job\r\n1,name1,20,job1\r\n2,name2,20,job2\r\n3,name3,20,job3\r\n4,name4,20,job4\r\n5,name5,20,job5\r\n6,name6,20,job6\r\n7"
},
{
"path": "SwiftCSVTests/TestData/quotes.csv",
"chars": 212,
"preview": "id,\"name, first\",\"name, last\"\n4,\"Alex\",Smith\n5,Joe,Bloggs\n9,\"Person, with a \"\"quote\"\" in their name\",uugh\n10,\"Person, wi"
},
{
"path": "SwiftCSVTests/TestData/utf8_with_bom.csv",
"chars": 84,
"preview": "Part Number,Description,Unit Price,Qty\r\n12345,Heizölrückstoßabdämpfung,\"€ 100,00\",2"
},
{
"path": "SwiftCSVTests/TestData/wonderland.csv",
"chars": 295,
"preview": "Character,Quote\nWhite Rabbit,\"\"\"Where shall I begin, please your Majesty?\"\" he asked.\"\nKing,\"\"\"Begin at the beginning,\"\""
},
{
"path": "SwiftCSVTests/URLTests.swift",
"chars": 4847,
"preview": "//\n// URLTests.swift\n// SwiftCSV\n//\n// Created by Will Richardson on 8/04/16.\n// Copyright © 2016 Naoto Kaneko. All "
}
]
About this extraction
This page contains the full source code of the naoty/SwiftCSV GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 48 files (403.5 KB), approximately 163.8k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.