iOS开发.csv文件的读写操作

项目中的运动轨迹改了新策略,之前是用json上传,服务器那边还要把经纬度等数据入库,给客户端返轨迹数据的时候还要各种查询组装数据,轨迹点少的时候还好,但随着轨迹点的增加服务端压力挺大的,最后选择了一个折中方案,用上传CSV文件的方式上传轨迹放在云存储里,后台给客户端返轨迹数据的时候只需要返一个文件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];
    //创建盛放CSV文件的文件夹
    if (![fileManager fileExistsAtPath:pathString])
    {
        [fileManager createDirectoryAtPath:pathString withIntermediateDirectories:YES attributes:nil error:nil];
    }
    return pathString;
}

在这个路径下写入文件 使用了NSOutputStream分段写入,用换行符间隔

/**
 将数据取出 写入文件
 
 @param filename 文件路径
 @param success 完成回调
 
 */
-(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++)
        {//随机数据
            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文件夹就是我们命名并创建的盛放CSV文件的文件夹,4a0055533161d8f5f731f73a66bfaf21.csv就是我们写入的文件

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

读文件

先像上面一样,创建一个盛放下载文件的文件夹,然后将下载的文件管理在这个文件夹内,这里文件的命名使用的文件url MD5加密的,然后根据路径读取文件就行了。

/**
 读文件
 
 @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就是我们读到的内容,是一个超长的字符串,每一段数据用换行符分隔,每段数据用逗号分隔.

具体的代码可以去下载源码

以上。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容