将csv文件解析为NSMutableArray

问题描述 投票:0回答:1

我知道这些说明都是关于如何在 Objective c 中读取 .csv 文件然后将其传递给 NSMuatbleArray 的,但是当我将其分配给 mutableArray 时,我遇到了问题。我花了几个小时在线检查并尝试修复它,但没有任何帮助。

这是我的目标c代码:

NSError *err;
NSString *filePath = [NSString stringWithContentsOfFile:@"/users/Mike/Desktop/Book1.csv" encoding:NSUTF8StringEncoding error:&err];

NSString *replace = [filePath stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSString *something = [replace stringByReplacingOccurrencesOfString:@"," withString:@"\n"];

NSMutableArray *columns = [[NSMutableArray alloc] initWithObjects:[something componentsSeparatedByString:@"\n"], nil];

NSLog(@"%@", filePath);
NSLog(@"%@", something);
NSLog(@"%@", columns);

这是输出:

My App[1854:54976] Kitchen,Bathroom,Dinning Room,Living Room
My App[1854:54976] Kitchen
Bathroom
Dinning Room
Living Room

My App[1854:54976] (
        (
        Kitchen,
        Bathroom,
        "Dinning Room",
        "Living Room"
    )
)

问题是数组的输出带有我删除的逗号和引号。

我需要的是数组“列”像字符串“something”一样出现。

更新

我拿走了“replace”和“something”这两个字符串,将数组切换为:

columns = [[NSMutableArray alloc] initWithObjects:[filePath componentsSeparatedByString:@","], nil];

现在我无法将其加载到表视图中。这是我的代码。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"firstCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
    
    cell.textLabel.text = [columns objectAtIndex:indexPath.row];
    return cell;
}

该应用程序只是因无法解释的原因而崩溃,但是当我手动创建另一个数组时,它可以工作。

这个有效:

NSMutableArrayrow = [[NSMutableArray alloc] initWithObjects:@"First", @"Second", nil];
ios objective-c csv
1个回答
2
投票

您的代码有点混乱,并且包含一个错误,该错误是导致您无法解释的括号的原因。

  • 当引号中没有引号时,为什么要将引号替换为空? 源数据?
  • 为什么要用换行符替换逗号,然后将字符串拆分成 换行符上的字符串数组(它消除了该行 完全打破)?为什么不直接使用将字符串拆分为数组 逗号并跳过中间步骤?
  • 最后,也是最严重的,该方法
    initWithObjects
    想要一个 以逗号分隔的对象集,然后是 nil。你正在传递它 数组和零。所以你得到的结果是一个可变的 包含单个对象的数组,即不可变数组。这是 几乎可以肯定不是你想要的。

这一行:

NSMutableArray *columns = 
  [[NSMutableArray alloc] initWithObjects:
    [something componentsSeparatedByString:@"\n"], nil];

...错了。

您可以像这样使用 initWithObjects :

NSMutableArray *columns = 
  [[NSMutableArray alloc] initWithObjects: @"one", @"two", @"three", nil];

请注意我如何传递一个以逗号分隔的对象列表,然后传递一个 nil。您对 initWithObjects 的使用是传入一个对象、一个数组,然后传入一个 nil。您不会获得包含源数组中的对象的可变数组 - 您将获得包含起始不可变数组的可变数组。

应该这样写:

NSMutableArray *columns = [[something componentsSeparatedByString:@"\n"] 
  mutableCopy];

或者更好的是,分两步完成,这样就清楚发生了什么:

NSArray *tempArray = [something componentsSeparatedByString:@"\n"];
NSMutableArray *columns = [tempArray mutableCopy];
© www.soinside.com 2019 - 2024. All rights reserved.