将.csv数据导入数组

use*_*601 10 csv arrays macos import swift

我在去年使用Objective-C.现在我正在尝试使用swift的Xcode 6 beta 4.

我想将.csv格式导入我的网络服务器到一个数组.我在Objective-C中的旧代码是:

NSString *stringURL = @"https:// [URL] /versionen/versionen.csv";
NSURL  *url = [NSURL URLWithString:stringURL];
NSData *urlData = [NSData dataWithContentsOfURL:url];
if ( urlData )
{
    NSString *csvResponseString = [[NSString alloc] initWithData:urlData   encoding:NSUTF8StringEncoding];
    NSArray         *MZVersionDatenZeilen = [csvResponseString componentsSeparatedByString:@"\n"];
    NSEnumerator    *MZVersionEnumerator = [MZVersionDatenZeilen objectEnumerator];
    NSMutableArray  *MZVersionDatenArray = [NSMutableArray arrayWithCapacity:[MZVersionDatenZeilen count]];
    NSString        *MZVersionZeile;
    while (MZVersionZeile = [MZVersionEnumerator nextObject])
    {
        [MZVersionDatenArray addObject:[MZVersionZeile componentsSeparatedByString:@";"]];
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎么能在Swift中这样做?有最佳做法 - 推荐吗?

Ale*_*der 13

有多个swift库可用:

CSVImporter,它是一个适用于处理大型csv文件的异步解析器.

let path = "path/to/your/CSV/file"
let importer = CSVImporter<[String]>(path: path)
importer.startImportingRecords { $0 }.onFinish { importedRecords in
    for record in importedRecords {
        // record is of type [String] and contains all data in a line
    }
}
Run Code Online (Sandbox Code Playgroud)

SwiftCSV,它是OSX和iOS的简单CSV解析库.

let csvURL = NSURL(string: "users.csv")!
var error: NSErrorPointer = nil
let csv = CSV(contentsOfURL: csvURL, error: error)

// Rows
let rows = csv.rows
let headers = csv.headers  //=> ["id", "name", "age"]
let alice = csv.rows[0]    //=> ["id": "1", "name": "Alice", "age": "18"]
let bob = csv.rows[1]      //=> ["id": "2", "name": "Bob", "age": "19"]

// Columns
let columns = csv.columns
let names = csv.columns["name"]  //=> ["Alice", "Bob", "Charlie"]
let ages = csv.columns["age"]    //=> ["18", "19", "20"]
Run Code Online (Sandbox Code Playgroud)

CSwiftV,这是一个符合rfc4180规范的csv解析器,但据作者说,它全部在内存中,因此不适合大文件.

let inputString = "Year,Make,Model,Description,Price\r\n1997,Ford,E350,descrition,3000.00\r\n1999,Chevy,Venture,another description,4900.00\r\n"
let csv = CSwiftV(String: inputString)

let headers = csv.headers // ["Year","Make","Model","Description","Price"]
let rows = csv.rows 
// [
//  ["1997","Ford","E350","descrition","3000.00"],
//  ["1999","Chevy","Venture","another description","4900.00"]
// ]
Run Code Online (Sandbox Code Playgroud)

  • Downvoted是因为SwiftCSV不是CSV解析器的正确实现.还有很多其他的,我发现为我工作的是CSwiftV - 在这里找到:https://github.com/Daniel1of1/CSwiftV (2认同)
  • 该库已被作者弃用. (2认同)

Wil*_* T. 11

每个答案都要求您安装/下载第三方实用程序,但如果您使用的文件非常简单或者您在限制第三方代码的公司工作,那么这可能不是最佳选择.

所以我想我会发布令人难以置信的基本的常规CSV文件处理代码,人们可以将其作为基础并根据需要进行简单的CSV处理.

do {
    let file = try String(contentsOf: fileUrl)
    let rows = file.components(separatedBy: .newlines)
    for row in rows {
        let fields = row.replacingOccurrences(of: "\"", with: "").components(separatedBy: ",")
        print(fields)
    }
} catch {
    print(error)
}
Run Code Online (Sandbox Code Playgroud)

这将处理您知道没有引号和逗号作为字段内容的一部分的任何CSV文件,在我的情况下,这些文件是大多数CSV文件.比这更复杂的东西,我建议使用其他答案中发布的一个库.

我希望这可以节省一些打字的人.


n13*_*n13 9

根据目前最受欢迎的答案,不要使用SwiftCSV.

SwiftCSV目前不处理双引号,因此如果CSV文件中的任何数据中包含换行符或逗号,SwiftCSV将无效.而且你可能浪费宝贵的开发时间找出它无法正常工作的原因......为了节省你的时间,只需使用另一个库.

CSwiftV库的工作对我非常好: https://github.com/Daniel1of1/CSwiftV

它处理引用的文本,换行符,逗号,就像我的数据上的魅力一样.它还具有单元测试并符合rfc4180标准.