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 で作成されたもので、行末に2 文字( ) が使用されているために発生している可能性があります。CR+LFコードで行をCR分割してから再度分割するとLF、空の行が作成されます。

のカウントがarr6 未満であるか、または の長さ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] と同様に、以前はこれらの 2 行の間にあったコードは不要です。そして、上記により、[arr release] の必要がなくなります。

(そして、偽の呼び出しを削除しないと[[NSString alloc] initWithFormat:@"%@", ...、大量のストレージがリークします。)

(これを提供する主な理由は、(自分が何をしているのかよくわからない状態でコピー/貼り付けを行うことによって) コードが複雑すぎて理解できないためです。単純化することで、問題をより正確に把握できます。)

于 2012-10-17T18:11:11.573 に答える