0

デフォルトのデータセットをcsvファイルからコアデータデータベースにロードしようとしています。そのため、最初はcsvファイルを読み込んでログに出力してから、コアデータデータベースに追加しようとしています。

これは私が使用しているコードです。

//Find import file;

NSString *defaultCSVPath = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"csv"];

//Get the data into a string

NSString *fileString = [NSString stringWithContentsOfFile:defaultCSVPath encoding:NSUTF8StringEncoding error:nil];

if ( nil == fileString ) {
    NSLog(@"Could not open file data.csv");
    abort();
}
// Create the scanner
NSScanner *scanner = [NSScanner scannerWithString:fileString];

// Ignore new lines
[scanner setCharactersToBeSkipped:
 [NSCharacterSet characterSetWithCharactersInString:@"\n"]];

NSString *sNumber = @"";
NSString *sTitle = @"";

//Gets to here and this expression is never TRUE
while ( [scanner scanString:@"," intoString:&sNumber] && [scanner scanString:@"," intoString:&sTitle]) {
    NSLog(@"sNumber:%@ sTitle:%@",sNumber,sTitle);
}

私が使用しているサンプルデータは次のとおりです。

A15Q,Test1
F74443AAZ,Test2

コードをトレースすると、while句が表示され、スキップされます。

4

1 に答える 1

0

sNumberとsTitleを@""に初期化する理由がわかりません。nilがより適切なデフォルトです(または、それらを初期化することはできません)。

[scanner scanString:@"," intoString:&foo]カンマが表示されることを期待し、コンマを返しますfoo(これは、一貫性と(私が思うに)Unicodeの機能のために行われます)。

あなたはおそらくこのようなことをしたいと思うでしょう:

  1. カンマの前にすべてを読んでください。
  2. カンマをスキップします。
  3. 改行の前にすべてを読んでください。
  4. 改行をスキップします。

(そして、何らかの理由で、フォーマットを機能させるために、ここに何かを貼り付ける必要があります。)

while (
     [scanner scanUpToStringString:@"," intoString:&sNumber]
  && [scanner scanString:@"," intoString:NULL]
  && [scanner scanUpToString:@"\n" intoString:&sTitle]
  && [scanner scanString:@"\n" intoString:NULL]
) {
  NSLog(@"sNumber:%@ sTitle:%@",sNumber,sTitle);
}

CSVを解析しようとしているとすると、これには独自の問題があります。

  • おそらく、\ r\nを改行として扱いたいと思うでしょう。
  • 空白行やコンマのない行はきれいに処理されません。
  • 引用符で囲まれた文字列(例)は処理しません"a,b","c,d,e,f"
于 2010-09-26T11:47:17.190 に答える