CSV
逗號分隔值(Comma-Separated Values霹琼,CSV务傲,有時也稱為字符分隔值凉当,因為分隔字符也可以不是逗號),其文件以純文本形式存儲表格數(shù)據(jù)(數(shù)字和文本)售葡。(:來自百度百科)
CSV其實就是一個純文本,那么對應(yīng)到 Objective-C 中看杭,他就是一個
NSString
,對應(yīng)到 Swift 中就是一個String
舉個??
sj_mino1001.jpg,715282,4FB55FE8
sj_mino1002.jpg,471289,93203C5C
sj_mino1003.jpg,451929,C4E80467
這個就是一個簡單的CSV文件,每個值之間用,分割,在一行數(shù)據(jù)結(jié)束的時候才換行。
CSV讀取
假設(shè)我們的項目中有一個 csv 文件挟伙,叫做1
-
獲取文件路徑
NSString *path = [[NSBundle mainBundle]pathForResource:@"1" ofType:@"csv"];
-
將此文件轉(zhuǎn)碼為一個字符串
NSError *error = nil; //GBK編碼 NSString *fileContents = [NSString stringWithContentsOfFile:path encoding:0x80000632 error:&error]; //UTF8編碼 NSString *fileContents = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
切割字符串楼雹,可以拿到每一行的數(shù)據(jù)
//取出每一行的數(shù)據(jù)
NSArray *_allLinedStrings = [fileContents componentsSeparatedByString:@"\r\n"];
- 如果有表頭可以對表頭進行處理,即對第一行數(shù)據(jù)進行處理
__block NSInteger nameRow = 0;
__block NSInteger phoneRow = 0;
NSArray *firstLine = [_allLinedStrings[0] componentsSeparatedByString:@","];
[firstLine enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSString *line = obj;
if ([line isEqualToString:@"客戶名稱"]){
nameRow = idx;
}
else if ([line isEqualToString:@"手機號"]){
phoneRow = idx;
}
}];
-
對數(shù)據(jù)進行處理
[_allLinedStrings enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if (idx == 0) { } else{ NSString *str = obj; NSArray *array = [str componentsSeparatedByString:@","]; //獲取到某一行的數(shù)據(jù)尖阔,切割這個字符串就可以拿到這一行的值贮缅,然后在進行下一步的處理 } }];
CSV文件的寫入
假設(shè)我們有一個 likee.csv 需要放在Documents目錄下
-
創(chuàng)建寫入路徑
NSString *fileNameStr = @"likee.Csv"; NSString *DocPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:fileNameStr];
2.夠造需要寫入的數(shù)據(jù)
NSString *str = @"11111,22222,33333,44444\n";
NSMutableString *csvString = [NSMutableString string];
for (int i = 0; i< 400; i ++) {
[csvString appendString:str];
};
3.夠造為NSData,并使用NSData進行文件的寫入介却。
NSData *data = [csvString dataUsingEncoding:NSUTF8StringEncoding];
[data writeToFile:DocPath atomically:YES];
編碼格式的坑
在 mac 下文本的默認編碼格式使用的是UTF-8谴供,在 windows 的 Excel 上,對中文的處理是GBK,所以可能會造成亂碼的問題筷笨。如果讀取文件是無法讀出內(nèi)容憔鬼,就和使用的編碼格式有關(guān)。所以建議先使用UTF-8進行解碼胃夏,如果無法顯示內(nèi)容轴或,再用GBK進行解碼
//UTF8編碼
NSString *fileContents = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
if(!fileContents){
//GBK編碼
fileContents = [NSString stringWithContentsOfFile:path encoding:0x80000632 error:&error];
}