iOS開發(fā).csv文件的讀寫操作

項目中的運動軌跡改了新策略,之前是用json上傳,服務器那邊還要把經(jīng)緯度等數(shù)據(jù)入庫,給客戶端返軌跡數(shù)據(jù)的時候還要各種查詢組裝數(shù)據(jù),軌跡點少的時候還好,但隨著軌跡點的增加服務端壓力挺大的,最后選擇了一個折中方案,用上傳CSV文件的方式上傳軌跡放在云存儲里,后臺給客戶端返軌跡數(shù)據(jù)的時候只需要返一個文件url,客戶端下載文件再讀取就好了。

寫文件

生成文件夾以及文件路徑

/**
 生成本地寫的文件的路徑
 
 @return 沙盒路徑
 */
- (NSString *)findLocalPath
{
    NSString* documentsDir = [self creatFile:@"LocationCsv"];//在cache目錄下生成一個盛放CSV的文件夾
    NSString *name = [NSString stringWithFormat:@"location%@",self.fid];
    NSString *md5  = [self md5:name];//md5加密保證文件的唯一性
    NSString* csvPath = [NSString stringWithFormat:@"%@/%@.csv",documentsDir,md5];//文件路徑
    NSLog(@"%@",csvPath);
    return csvPath;
}

- (NSString *)creatFile:(NSString *)name
{
    NSString *pathString = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    pathString = [NSString stringWithFormat:@"%@/%@",pathString,name];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    //創(chuàng)建盛放CSV文件的文件夾
    if (![fileManager fileExistsAtPath:pathString])
    {
        [fileManager createDirectoryAtPath:pathString withIntermediateDirectories:YES attributes:nil error:nil];
    }
    return pathString;
}

在這個路徑下寫入文件 使用了NSOutputStream分段寫入,用換行符間隔

/**
 將數(shù)據(jù)取出 寫入文件
 
 @param filename 文件路徑
 @param success 完成回調(diào)
 
 */
-(void)exportCsv:(NSString*)filename success:(voidBlock)success
{
    [self createTempFile: filename];
    NSOutputStream* output = [[NSOutputStream alloc] initToFileAtPath: filename append: YES];
    [output open];
    if (![output hasSpaceAvailable])
    {
        NSLog(@"No space available in %@", filename);
    }else
    {
        NSInteger result = 0;
        for (int i = 0; i < 100; i++)
        {//隨機數(shù)據(jù)
            NSString *ctime             = [NSString stringWithFormat:@"%ld",arc4random()%10000000000];
            NSString *longitude         = [NSString stringWithFormat:@"%u",arc4random()%1000000000];
            NSString *latitude          = [NSString stringWithFormat:@"%u",arc4random()%100000000];
            NSString *elevation         = [NSString stringWithFormat:@"%u",arc4random()%10000000];
            NSString *distance          = [NSString stringWithFormat:@"%u",arc4random()%1000000];
            NSString *toprecosttime     = [NSString stringWithFormat:@"%u",arc4random()%100000];
            NSString *tostartcosttime   = [NSString stringWithFormat:@"%u",arc4random()%10000];
            NSString *speed             = [NSString stringWithFormat:@"%u",arc4random()%1000];

            NSString* line = [[NSString alloc]initWithFormat:@"%@,%@,%@,%@,%@,%@,%@,%@\n",ctime, longitude, latitude, elevation,distance,toprecosttime,tostartcosttime,speed];
            if (i == 100 - 1)
            {
                line = [[NSString alloc]initWithFormat:@"%@,%@,%@,%@,%@,%@,%@,%@",ctime, longitude, latitude, elevation,distance,toprecosttime,tostartcosttime,speed];
            }
            uint8_t buffer[2048];
            memcpy(buffer, [line UTF8String], [line length]+1);
            result = [output write:buffer maxLength: [line length]];
        }
    }
    [output close];
    success();
}

/**
 將文件寫入沙盒
 
 @param filename 文件路徑
 */
- (void)createTempFile:(NSString*)filename
{
    NSFileManager* fileSystem = [NSFileManager defaultManager];
    [fileSystem removeItemAtPath: filename error: nil];
    
    NSMutableDictionary* attributes = [[NSMutableDictionary alloc] init];
    NSNumber* permission = [NSNumber numberWithLong: 0640];
    [attributes setObject: permission forKey: NSFilePosixPermissions];
    if (![fileSystem createFileAtPath: filename contents: nil attributes: attributes])
    {
        NSLog(@"Unable to create temp file for exporting CSV.");
    }
}

通過打印可以看到文件存放的位置

/Users/**這里是我的用戶名**/Library/Developer/CoreSimulator/Devices/45791D41-52ED-4BEC-85B3-419F577244BB/data/Containers/Data/Application/6B23F221-E755-4E00-8B6C-106118E0257C/Library/Caches/LocationCsv/4a0055533161d8f5f731f73a66bfaf21.csv
屏幕快照 2018-06-07 15.41.23.png

可以看到LocationCsv文件夾就是我們命名并創(chuàng)建的盛放CSV文件的文件夾,4a0055533161d8f5f731f73a66bfaf21.csv就是我們寫入的文件

屏幕快照 2018-06-07 15.47.34.png

讀文件

先像上面一樣,創(chuàng)建一個盛放下載文件的文件夾,然后將下載的文件管理在這個文件夾內(nèi),這里文件的命名使用的文件url MD5加密的,然后根據(jù)路徑讀取文件就行了。

/**
 讀文件
 
 @param path 文件路徑
 */
- (void)inputFile:(NSString *)path suc:(stringBlock)success
{
    NSError *error = nil;
    unsigned long encode = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
    NSString *fileContents = [NSString stringWithContentsOfFile:path encoding:encode error:&error];
    success(fileContents);
}

這個fileContents就是我們讀到的內(nèi)容,是一個超長的字符串,每一段數(shù)據(jù)用換行符分隔,每段數(shù)據(jù)用逗號分隔.

具體的代碼可以去下載源碼

以上。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容