3

CSV ファイルの内容を配列に取り込もうとしています。行ごとに1つのレコードを作成する前にこれを実行し、改行文字を使用して文字セットとしてscanUpToCharactersFromSet:intoString:渡すと、次のようになります。newlineCharacterSet

while ([lineScanner scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] 
                                   intoString:&line])

現在、エントリ自体の多くに改行文字が含まれているファイルを扱っています。各レコード (文字) の最後に一意の文字を追加しようとしました*が、ループは 1 回しか実行されません。私が知らないwhileループを壊しているものはありますか? これが私が今使っているコードです:

NSError *error;
NSString *data = [[NSString alloc] initWithContentsOfFile:[[self delegate] filePath] encoding:NSUTF8StringEncoding error:&error];
NSScanner *lineScanner = [NSScanner scannerWithString:data];
NSString *line = nil;

// Start parsing the CSV file
while ([lineScanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"*"]
                    intoString:&line]) {
    NSArray *elements = [line componentsSeparatedByString:@","];
    NSLog("Name: %@", [elements objectAtIndex:1]);
}

**編集: ** 以下の Peter の回答のおかげで、スキャナーが * 文字の後ろで動かなくなっていることがわかりました。ループに次の行を追加しました。

[lineScanner scanCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"*"] intoString:NULL];

そして今、それは正常に機能しています。

4

2 に答える 2

2

一度に 1 つのパスを見てみましょう。

  1. 初め:

    while ([lineScanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:[NSCharacterSet newlineCharacterSet]] intoString:&line]) {
    

    スキャナーは、改行前のすべてを に入れますline。改行まで進みます。

  2. 2番:

    while ([lineScanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:[NSCharacterSet newlineCharacterSet]] intoString:&line]) {
    

    スキャナはすでに改行しているため、文字はスキャンされません。文書化されているように、文字をスキャンしなかったため、 を返しますNO。ループが終了します。

解決策は、ループの最後にある改行をスキャンして、スキャナーがそれを通過するようにすることです。NULL改行が何であるかを気にしないと仮定して、出力パラメーターを渡すことができます。

これは正しい動作です。スキャンした文字が何であるかを気にした場合、これによりそれらを取得できます。NSScanner が文字を自動的にスキャンした場合、これはさらに困難になります。

于 2010-01-22T08:19:29.290 に答える
0

while 条件が間違っていると思います。String Programming Guideによると、次のようになります。

while ([theScanner isAtEnd] == NO) {
    [lineScanner scanUpToCharactersFromSet:[NSCharacterSet characterSetWithCharactersInString:@"*"] intoString:&line]
    // ...
}
于 2010-01-22T08:05:46.543 に答える