1. 程式人生 > >iOS CSV格式存取

iOS CSV格式存取

逗號分隔值(Comma-Separated Values,CSV,有時也稱為字元分隔值,因為分隔字元也可以不是逗號),其檔案以純文字形式儲存表格資料(數字和文字)。純文字意味著該檔案是一個字元序列,不含必須像二進位制數字那樣被解讀的資料。CSV檔案由任意數目的記錄組成,記錄間以某種換行符分隔;每條記錄由欄位組成,欄位間的分隔符是其它字元或字串,最常見的是逗號或製表符。通常,所有記錄都有完全相同的欄位序列。通常都是純文字檔案。建議使用WORDPAD或是記事本(NOTE)來開啟,再則先另存新檔後用EXCEL開啟,也是方法之一。

csv格式的檔案是一種佔記憶體很小的文字文件,它的特點:

1) 、開頭是不留空  ,以行為單位。

2)、每條記錄佔一行,以逗號為分隔符。列為空也要表達其存在。

3) 、可含或不含列名,如果含列名則居檔案第一行。

4)、一行資料不跨行,無空行。

5)、欄位中包含有逗號符,該欄位必須用雙引號括起來。

6)、欄位中包含有換行符,該欄位必須用雙引號括起來。

7)、欄位前後包含有空格,該欄位必須用雙引號括起來。( a b c ==> "a b c")

8)、欄位中的雙引號,用兩個雙引號表示。( "def"。 ==> ""def""。 )

9)、欄位中如果有雙引號,該欄位必須用雙引號括起來。( 我:"abc"。 ==> "說:""abc""。   

(內容如存在半形引號(即"),替換成半形雙引號("")轉義,即用半形引號(即"")將該欄位值包含起來)

例如:

1001.jpg,715282,4FB55FE8,

1002.jpg,471289,93203C5C,

1003.jpg,451929,C4E80467,

/**
 * 將資料 寫入檔案
 * @param filename 檔案路徑(沙盒路徑)
 * @param arr      待寫入的資料
 * @param success  完成回撥
 */
+ (void)exportCsv:(NSString*)filename dataSource:(NSArray *)arr  success:(voidBlock)success
{
    NSOutputStream* output = [[NSOutputStream alloc] initToFileAtPath: filename append: YES];
    [output open];
    if (![output hasSpaceAvailable])
    {
        NSLog(@"No space available in %@", filename);
    }else
    {
        for (int i = 0; i < arr.count; i++)
        {
            NSDictionary *dic = arr[i];
            NSString *name = [NSString stringWithFormat:@"%@",dic[@"name"]];
            NSString *age  = [NSString stringWithFormat:@"%@",dic[@"age"]];
            NSString *sex  = [NSString stringWithFormat:@"%@",dic[@"sex"]];
            
            NSString  *str = [[NSString alloc]initWithFormat:@"%@,%@,%@\n",name,age,sex];
            if (i == arr.count - 1)
            {
                 str  = [[NSString alloc]initWithFormat:@"%@,%@,%@",name,age,sex];
            }
            NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
            [output write:data.bytes maxLength:data.length];
        }
    }
    [output close];
    success();
}
/**
 * 讀取檔案裡的內容
 * @param filePath 傳入路徑(沙盒路徑)
 * return          檔案裡的內容
 */
+(NSArray *)readFileContent:(NSString *)filePath{
    NSMutableArray *array = [NSMutableArray array];
    NSString *filepath=filePath;
    FILE *fp = fopen([filepath UTF8String], "r");
    if (fp) {
        char buf[BUFSIZ];
        fgets(buf, BUFSIZ, fp);
        NSString *a = [[NSString alloc] initWithUTF8String:(const char *)buf];
        NSString *aa = [a stringByReplacingOccurrencesOfString:@"\r" withString:@""];
        aa = [aa stringByReplacingOccurrencesOfString:@"\n" withString:@""];
        //獲取的是表頭的欄位
        NSArray *b = [aa componentsSeparatedByString:@","];
        
        while (!feof(fp)) {
            char buff[BUFSIZ];
            fgets(buff, BUFSIZ, fp);
            //獲取的是內容
            NSString *s = [[NSString alloc] initWithUTF8String:(const char *)buff];
            NSString *ss = [s stringByReplacingOccurrencesOfString:@"\r" withString:@""];
            ss = [ss stringByReplacingOccurrencesOfString:@"\n" withString:@""];
            NSArray *a = [ss componentsSeparatedByString:@","];
            
            NSMutableDictionary *dic = [NSMutableDictionary dictionary];
            for (int i = 0; i < b.count ; i ++) {
                //組成字典陣列
                dic[b[i]] = a[i];
            }
            
            [array addObject:dic];
        }
    }
    return array;
}