美文网首页
iOS开发.csv文件的读写操作

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

作者: 不会写代码的尬先生 | 来源:发表于2018-06-07 16:01 被阅读0次

    项目中的运动轨迹改了新策略,之前是用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就是我们读到的内容,是一个超长的字符串,每一段数据用换行符分隔,每段数据用逗号分隔.

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

    以上。

    相关文章

      网友评论

          本文标题:iOS开发.csv文件的读写操作

          本文链接:https://www.haomeiwen.com/subject/ubugsftx.html