在Objective-C中读取文件时处理换行符

时间:2012-10-17 17:49:09

标签: objective-c ios csv

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

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,
,

)

非常感谢先进。

3 个答案:

答案 0 :(得分:1)

这可能正在发生,因为您使用的文件是在Windows中创建的,uses two charactersCR+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;
    }
    ...
}

这也将处理文件中有一个空白行的情况。

答案 1 :(得分:0)

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

答案 2 :(得分: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:@"%@", ...电话,则会泄漏大量存储空间。)

(请注意,我之所以这么做是因为(通过复制/粘贴而不知道你在做什么),你的代码太复杂了,你无法理解它。通过简化你可以更好地解决问题。 )