CSV全稱 Comma Separated values坛怪,是一種用來存儲數(shù)據(jù)的純文本文件格式誊涯,通常用于電子表格或數(shù)據(jù)庫軟件。用Excel或者Numbers都可以導(dǎo)出CSV格式的數(shù)據(jù)。
CSV是一種簡單的數(shù)據(jù)文件交換方式欧募,體積小、操作占用內(nèi)存小鹰祸、 生成速度快甫窟、行數(shù)無限制。
在一般情況下比Excel 更為簡單方便蛙婴, 導(dǎo)出文件是首選粗井。
CSV 的基本規(guī)則:
1.開頭是不留空,以行為單位街图。
2.可含或不含列名浇衬,含列名則居文件第一行。
3.一行數(shù)據(jù)不跨行餐济,無空行耘擂。
4.以半角逗號(即,)作分隔符,列為空也要表達其存在絮姆。
5.列內(nèi)容如存在半角逗號(即,)則用半角雙引號(即"")將該字段值包含起來醉冤。
6.列內(nèi)容如存在半角引號(即")則應(yīng)替換成半角雙引號("")轉(zhuǎn)義,并用半角引號(即"")將該字段值包含起來滚朵。
7.文件讀寫時引號冤灾,逗號操作規(guī)則互逆。
8.內(nèi)碼格式不限辕近,可為 ASCII韵吨、Unicode 或者其他。
9.不支持特殊字符
知道了CSV的基本規(guī)則移宅,你是否有思路了呢归粉?
實現(xiàn)思路:
1、我們知道sqlite數(shù)據(jù)表里面的列名漏峰,首先把sqlite的列名寫入表頭糠悼。
2、其次是讀取sqlite的每一行的數(shù)據(jù)浅乔。sqlite3_step(compiledStatement) == SQLITE_ROW
我們把讀取出來的數(shù)據(jù)倔喂,拼接成如:NSString* line = [[NSString alloc] initWithFormat: @"%d,%@,%s,%s\r\n", sqliteID, viewUIDString, key_number, time_1];寫到我們的CSV文件里面。記得使用“\r\n”進行換行靖苇,我在mas os上面使用"\n"席噩,在Windows上打開CSV文件卻沒進行換行。
簡單介紹一下
\n是換行贤壁,英文是New line悼枢,表示使光標到行首
\r是回車,英文是Carriage return脾拆,表示使光標下移一格
\r\n表示回車換行
1馒索、\n 軟回車:
在Windows 中表示換行且回到下一行的最開始位置莹妒。相當于Mac OS 里的 \r 的效果。
在Linux绰上、unix 中只表示換行旨怠,但不會回到下一行的開始位置。
2渔期、\r 軟空格:
在Linux运吓、unix 中表示返回到當行的最開始位置。
在Mac OS 中表示換行且返回到下一行的最開始位置疯趟,相當于Windows 里的 \n 的效果拘哨。
//導(dǎo)出csv文件
- (void)exportCSV:(NSString*) filename
{
[self openDb];
NSOutputStream* output = [[NSOutputStream alloc] initToFileAtPath: filename append: YES];
[output open];
if (![output hasSpaceAvailable]) {
NSLog(@"No space available in %@", filename);
// TODO: UIAlertView?
} else {
NSString* header = @"id,ViewUID,key_number,time_1\r\n";
const uint8_t *headerStr = (const uint8_t *)[header cStringUsingEncoding:NSUTF8StringEncoding];
NSInteger result = [output write: headerStr maxLength: [header length]];
if (result <= 0) {
NSLog(@"exportCsv encountered error=%d from header write", result);
}
NSString* sqlStatement = @"select id,ViewUID,key_number,time_1 from UMAnlyticsTable";
// Setup the SQL Statement and compile it for faster access
sqlite3_stmt* compiledStatement;
if (sqlite3_prepare_v2(db, [sqlStatement UTF8String], -1, &compiledStatement, NULL) == SQLITE_OK)
{
// Loop through the results and write them to the CSV file
while (sqlite3_step(compiledStatement) == SQLITE_ROW) {
// Read the data from the result row
int sqliteID = (int)sqlite3_column_int(compiledStatement, 0);
char *viewUID = (char *)sqlite3_column_text(compiledStatement, 1);
char *key_number = (char *)sqlite3_column_text(compiledStatement, 2);
char *time_1 = (char *)sqlite3_column_text(compiledStatement, 3);
NSString *viewUIDString = [[NSString alloc] initWithUTF8String:viewUID];
NSString* line = [[NSString alloc] initWithFormat: @"%d,%@,%s,%s\r\n", sqliteID, viewUIDString, key_number, time_1];
NSStringEncoding enc
= CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);//編碼轉(zhuǎn)換,UTF8轉(zhuǎn)GBK
const uint8_t *lineStr = (const uint8_t *)[line cStringUsingEncoding:enc];
NSInteger lineLength = [line lengthOfBytesUsingEncoding:enc];
result = [output write:lineStr maxLength: lineLength];
if (result <= 0) {
NSLog(@"exportCsv encountered error=%d from header write", result);
}
}
// Release the compiled statement from memory
sqlite3_finalize(compiledStatement);
}
}
[output close];
[self closeDb];
}