一:CSV文件的读取
将导入的csv文件导入到程序中:
此操作是将csv文件放到了NSBundle里面,这样的做法不严谨,按常理是应该将这些数据放到缓存中
(在我的项目中的做法是首先将数据读取出来,然后在缓存目录中重新创建一个csv文件,将这些数据再写进去,如果有直接转移文件的方法,请告知,谢谢)
一:读取csv文件内容
NSString *path = [[NSBundle mainBundle] pathForResource:csvName ofType:@"csv"];
NSString *contents = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
NSArray *contentsArray = [contents componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
二:生成csv文件
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject];
NSString *filePath = [caches stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.csv",dateStr]];
WSCSVWriter *csvWrite = [[WSCSVWriter alloc]initWithPath:filePath];
NSArray *dataArr = @[@"123",@"456",@"789",@"987",@"654",@"321",@"000"];
[csvWrite writeArray:dataArr];
附上csv文件的工具类:
WSCSVWriter
#import <Foundation/Foundation.h>
@interface WSCSVWriter : NSObject
/**
* csv writer 初始化
*
* @param savePath 保存路径,路径中的文件扩展名是:.csv
*/
-(instancetype)initWithPath:(NSString *)savePath;
/**
* 将一个数组保存为csv文件
* 支持数组是元素是:数组、字典、字符串
*
* @param arr 要写入的数组
*/
-(void)writeArray:(NSArray *)arr;
/**
* 将一个字典保存为csv文件,字典的key和value必须为字符串
* 支持一个数组中保存着多个字典,并且字典的key是相同的,那么key只保存一次。first的值为true
*
* @param dict 要保存的字典
* @param first 是不是第一次保存
*/
-(void)writeDict:(NSDictionary *)dict forFirst:(BOOL)first;
@end
WSCSVWriter.m
#import "WSCSVWriter.h"
@interface WSCSVWriter ()
{
BOOL isFirst;
}
@property (nonatomic, copy) NSString *savePath;
@property (nonatomic, assign) NSStringEncoding encode;
@end
@implementation WSCSVWriter
-(NSStringEncoding)encode
{
if (_encode == 0) {
//gbk 编码
self.encode = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
}
return _encode;
}
-(void)writeDict:(NSDictionary *)dict forFirst:(BOOL)first{
NSMutableString *str = [NSMutableString string];
//第一次写入字典的key值
if (first) {
for (NSString *key in dict.allKeys) {
//"," 换列
[str appendString:[NSString stringWithFormat:@"%@,",key]];
}
}
//换行
[str appendString:@"\n"];
for (NSString *value in dict.allValues) {
[str appendString:[NSString stringWithFormat:@"%@,",value]];
}
[self writeData:[str dataUsingEncoding:self.encode]];
isFirst = false;
}
-(void)writeArray:(NSArray *)arr{
id element = arr[0];
if ([element isKindOfClass:[NSString class]]) {
NSMutableString *str_M = [NSMutableString string];
for (NSString *str in arr) {
[str_M appendString:[NSString stringWithFormat:@"%@\n",str]];
}
[str_M appendString:@"\n"];
[self writeData:[str_M dataUsingEncoding:self.encode]];
}
else if ([element isKindOfClass:[NSDictionary class]]){
isFirst = true;
for (NSDictionary *dict in arr) {
[self writeDict:dict forFirst:isFirst];
}
}
else if ([element isKindOfClass:[NSArray class]]){
for (NSArray *subArr in arr) {
[self writeArray:subArr];
}
}
}
-(BOOL)writeData:(NSData *)data{
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:self.savePath];
BOOL isSuccess;
if (!fileHandle) {
isSuccess = [data writeToFile:_savePath atomically:YES];
}else{
[fileHandle seekToEndOfFile];
[fileHandle writeData:data];
[fileHandle closeFile];
}
return isSuccess;
}
-(instancetype)initWithPath:(NSString *)savePath{
if (self = [super init]) {
_savePath = savePath;
//首先判断写的路径下有没有文件,有的话移除
NSFileManager *manager = [NSFileManager defaultManager];
if ([manager fileExistsAtPath:self.savePath]) {
[manager removeItemAtPath:self.savePath error:NULL];
}
}
return self;
}
@end