我的朋友,我有一个问题,希望你能帮助我。所以..这是我的代码:
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,
,
)
非常感谢先进。
答案 0 :(得分:1)
这可能正在发生,因为您使用的文件是在Windows中创建的,uses two characters(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;
}
...
}
这也将处理文件中有一个空白行的情况。
答案 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:@"%@", ...
电话,则会泄漏大量存储空间。)
(请注意,我之所以这么做是因为(通过复制/粘贴而不知道你在做什么),你的代码太复杂了,你无法理解它。通过简化你可以更好地解决问题。 )