0

朋友们,我有一个问题,希望你们能帮助我。所以..这是我的代码:

NSString* filePath = [[NSBundle mainBundle] pathForResource:@"convidados" ofType:@"csv"];
NSString* fileContents = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
NSMutableArray* pointStrings = [[NSMutableArray alloc] initWithArray:[fileContents componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]];

for(int idx = 0; idx < [pointStrings count]; idx++)
{

    NSString* currentPointString = [pointStrings objectAtIndex:idx];
    NSMutableArray* arr = [[NSMutableArray alloc] initWithArray:[currentPointString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"#"]]];

    NSString *nome = [[NSString alloc] initWithFormat:@"%@", [arr objectAtIndex:0]];
    NSString *email = [[NSString alloc] initWithFormat:@"%@", [arr objectAtIndex:1]];
    NSString *website = [[NSString alloc] initWithFormat:@"%@", [arr objectAtIndex:2]];
    NSString *telefone = [[NSString alloc] initWithFormat:@"%@", [arr objectAtIndex:3]];
    NSString *empresa = [[NSString alloc] initWithFormat:@"%@", [arr objectAtIndex:4]];
    NSString *cidade = [[NSString alloc] initWithFormat:@"%@", [arr objectAtIndex:5]];

    NSDictionary *registro = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects: nome, email , telefone, empresa, website, cidade, nil] forKeys:[NSArray arrayWithObjects:@"nome", @"email", @"telefone", @"empresa", @"website", @"cidade", nil]];

    [PessoaDAO adicionar:registro];

    [arr removeAllObjects];
    [arr release];

}

我的 csv 文件:

Usuario1# Usuario1@gmail.com# http://facebook.com/Usuario1# 99999999#Company# Cidade
Usuario2# Usuario2@gmail.com# http://Usuario2.com# 737373773# Company# Fortaleza
Usuario3# Usuario3@gmail.com# http://Usuario3.com.br# 83838484# Company Solutions# City

问题是当执行下面的行时,当右边只有 3 个对象时识别出 7 个对象。我相信那是因为“newlineCharacterSet”它们添加了一个“,”并混淆了执行。

NSMutableArray* pointStrings = [[NSMutableArray alloc] initWithArray:[fileContents componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]];

NSMutableArray pointStrings 执行:

<__NSArrayM 0x1c586990>(
Usuario1# Usuario1@gmail.com# http://facebook.com/Usuario1# 99999999#Company# City,
,
Usuario2# Usuario2@gmail.com# http://Usuario2.com# 737373773# Company# City,
,
Usuario3# Usuario3@gmail.com# http://Usuario3.com.br# 83838484# Company# City,
,

)

非常感谢。

4

3 回答 3

1

这可能是因为您使用的文件是在 Windows 中创建的,该文件在行尾使用两个字符( )。CR+LF您的代码将您的行CR拆分然后再次拆分,LF从而创建一个空行。

只需检查计数arr是否小于 6,或者长度currentPointString是否为 0,如果是,则继续:

for(int idx = 0; idx < [pointStrings count]; idx++) {

    NSString *currentPointString = [pointStrings objectAtIndex:idx];
    if ([currentPointString length] == 0) {
        continue;
    }
    NSMutableArray *arr = [currentPointString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"#"]];
    if ([arr count] < 6) {
        continue;
    }
    ...
}

这也将处理文件中以空行开头的情况。

于 2012-10-17T17:53:09.913 回答
0

“csv”是“逗号分隔值”的首字母缩写词,您的数据(如图所示)由空格而不是逗号分隔。

于 2012-10-17T17:53:30.903 回答
0

大部分与您的错误无关(无论是什么)-

NSArray* arr = [currentPointString componentsSeparatedByString:@"#"];
NSDictionary *registro = [[NSDictionary alloc] initWithObjects:arr forKeys:[NSArray arrayWithObjects:@"nome", @"email", @"website", @"telefonee", @"empresa", @"cidade", nil]];

这两行之间的代码是不必要的,[arr removeAllObjects] 也是如此。以上消除了对[arr release]的需要。

(如果您不删除虚假[[NSString alloc] initWithFormat:@"%@", ...呼叫,您将泄漏大量存储空间。)

(请注意,我提供这主要是因为(通过在不知道自己在做什么的情况下进行复制/粘贴)您的代码太复杂而无法理解。通过简化您可以更好地解决问题。)

于 2012-10-17T18:11:11.573 回答