我已经实现了用于读取csv文件的模块
项目结构如下:
Project
--test_de.csv
--Folder
--Controller.h
--Controller.m
但结果显示无响应。没有添加任何单词:
2014-06-19 15:32:16.817 marker[1748:60b] /var/mobile/Applications/E2B95450-429D-4777-97BE-0209522EFDEF/Documents/test_de.csv
2014-06-19 15:32:16.824 marker[1748:60b] (
)
以下是我的代码
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* fullPath = [paths objectAtIndex:0];
fullPath = [fullPath stringByAppendingPathComponent:@"test_de.csv"];
NSLog(@"%@", fullPath);
NSMutableArray *titleArray=[[NSMutableArray alloc]init];
NSString *fileDataString=[NSString stringWithContentsOfFile:fullPath encoding:NSUTF8StringEncoding error:nil];
NSArray *linesArray=[fileDataString componentsSeparatedByString:@"\n"];
int k=0;
for (id string in linesArray)
if(k<[linesArray count]-1){
NSString *lineString=[linesArray objectAtIndex:k];
NSLog(@"%@",lineString);
NSArray *columnArray=[lineString componentsSeparatedByString:@"\n"];
[titleArray addObject:[columnArray objectAtIndex:0]];
k++;
}
NSLog(@"%@",titleArray);
答案 0 :(得分:1)
对于资源,最好使用JSON格式而不是CVS-无论该资源是在运行时来自后端还是在构建时作为应用程序资源嵌入。
您可以使用iOS系统JSON解码器将文件解析为对象表示形式。这使您免去了实现自己的CVS解析器的众多麻烦。
此外,将CVS提供的任何输入转换为JSON作为应用程序的资源之前,应该毫不费力。
首先,确保您的资源文件已包含在项目中并已分配了目标(请参阅“文件检查器”窗格中的“目标成员身份”)。您也可以在“构建”的“复制捆绑资源”部分中进行检查。选择相关目标时,在目标编辑器中选择“阶段”标签。您的文件应在此处列出。
假定您将给定文件作为应用程序资源,则应使用Bundle
类读取该资源。首先获取其位置作为URL:
(注意:我仅在Swift中显示此内容,并保留Objective-C版本作为练习)
var fileUrl = Bundle.main.url(forResource: "test_de", withExtension: "json")
这还假设资源位于 app资源文件夹的根文件夹中,这是将文件标记为资源时的默认情况。请注意,“应用程序资源文件夹”对您来说是“不透明的”,也就是说,实际上您不需要知道它在哪里-Bundle
会为您处理所有这一切。
对于Objective-C,您可以在这里阅读:NSBundle
现在,您拥有URL,读取文件并获得一个Data对象:
let data = try Data(contentsOf: fileUrl)
对于Objective-C,您可以在这里阅读:NSData
将文件作为数据(NSData
或Data
)后,并假设其内容为JSON数组,则可以得到如下的对象表示形式:
NSError *error = nil;
id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error];
if ([jsonObject isKindOfClass:[NSArray class]]) {
...
}
else {
NSLog(@"did not find a JSON Array");
...
}
迅速执行此操作将需要您定义一个表示JSON数组中元素的类型(struct
)。通常,这很容易实现:
struct MyElement: Codable {
let field1: String
let field2: String
let field3: String
}
然后,使用Swift JSON解码器获取MyElement
s数组:
let elements = try JSONDecoder.decode([MyElement].self, from: data)
答案 1 :(得分:0)
根据SoulWithMobileTechnology,这是怎么做的
[self readTitleFromCSV:csvPath AtColumn:0];
我们的方法如下:
-(void)readTitleFromCSV:(NSString*)path AtColumn:(int)column
{
titleArray=[[NSMutableArray alloc]init];
NSString *fileDataString=[NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
NSArray *linesArray=[fileDataString componentsSeparatedByString:@"\n"];
int k=0;
for (id string in linesArray)
if(k<[linesArray count]-1){
NSString *lineString=[linesArray objectAtIndex:k];
NSArray *columnArray=[lineString componentsSeparatedByString:@";"];
[titleArray addObject:[columnArray objectAtIndex:column]];
k++;
}
NSLog(@"%@",titleArray);
}