1

一部のデータ (複数の列と複数の行) を含む Excel ファイルがあります。このデータをコア データ ベースのデータベースにインポートしたいと考えています。セル内のテキストに改行が含まれているため、データのインポートに苦労しています。

私は次のことを試しました:

1.) Excel をタブ区切りのテキスト ファイルにエクスポートする

2.) 次のコードを使用して、タブ区切りのテキスト ファイルを読み取る iOS のインポート ルートを記述します。

NSCharacterSet *tabCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"\t"];

NSArray *rows = [dataString componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
NSArray *columns = [row componentsSeparatedByCharactersInSet:tabCharacterSet];

問題: 1000 個あり、それぞれrows15columns個あります。解析ルーチンは 1000rowsを超えて 15 未満を返しますcolumns。セル内の改行が解析ルーチンによって適切に処理されていません。

を使用しても同じ結果が得られます

[NSCharacterSet characterSetWithCharactersInString:@"\r\n"];

また

[NSCharacterSet characterSetWithCharactersInString:@"\r"];

それ以外の

[NSCharacterSet newlineCharacterSet]

しかし、使用すると完全に失敗します

[NSCharacterSet characterSetWithCharactersInString:@"\n"];

どうすればExcelデータを適切に解析できますか?

おそらく、正規表現を使用して行コンポーネントを取得できますか? アイデア/ポインタはありますか?

更新 (サンプル XLSX およびエクスポート ファイル):

サンプル XLSX ファイル サンプルのタブ区切りテキスト ファイル

4

1 に答える 1

0

私にとってうまくいった解決策は、NSScannerクラスを使用することです。

- (NSArray *)parseCSVFileString {
    NSMutableArray *rows = [NSMutableArray array];

    // Get newline character set
    NSMutableCharacterSet *newlineCharacterSet = (id)[NSMutableCharacterSet whitespaceAndNewlineCharacterSet];
    [newlineCharacterSet formIntersectionWithCharacterSet:[[NSCharacterSet whitespaceCharacterSet] invertedSet]];

    // Characters that are important to the parser
    NSMutableCharacterSet *importantCharactersSet = (id)[NSMutableCharacterSet characterSetWithCharactersInString:@",\""];
    [importantCharactersSet formUnionWithCharacterSet:newlineCharacterSet];

    // Create scanner, and scan string
    NSScanner *scanner = [NSScanner scannerWithString:self];
    [scanner setCharactersToBeSkipped:nil];

    while (![scanner isAtEnd]) {

        @autoreleasepool {
            BOOL insideQuotes = NO;
            BOOL finishedRow = NO;
            NSMutableArray *columns = [NSMutableArray arrayWithCapacity:10];
            NSMutableString *currentColumn = [NSMutableString string];
            while ( !finishedRow ) {
                NSString *tempString;

                if ([scanner scanUpToCharactersFromSet:importantCharactersSet intoString:&tempString]) {
                    [currentColumn appendString:tempString];
                }

                if ([scanner isAtEnd]) {

                    if (![currentColumn isEqualToString:@""]) [columns addObject:currentColumn];

                    finishedRow = YES;

                } else if ([scanner scanCharactersFromSet:newlineCharacterSet intoString:&tempString]) {

                    if (insideQuotes) {
                        // Add line break to column text
                        [currentColumn appendString:tempString];

                    } else {
                        // End of row
                        if (![currentColumn isEqualToString:@""]) [columns addObject:currentColumn];

                        finishedRow = YES;
                    }

                } else if ([scanner scanString:@"\"" intoString:NULL]) {

                    if (insideQuotes && [scanner scanString:@"\"" intoString:NULL]) {
                        // Replace double quotes with a single quote in the column string.
                        [currentColumn appendString:@"\""];

                    } else {
                        // Start or end of a quoted string.
                        insideQuotes = !insideQuotes;
                    }

                } else if ([scanner scanString:@"," intoString:NULL]) {

                    if (insideQuotes) {
                        [currentColumn appendString:@","];

                    } else {
                        // This is a column separating comma
                        [columns addObject:currentColumn];
                        currentColumn = [NSMutableString string];
                        [scanner scanCharactersFromSet:[NSCharacterSet whitespaceCharacterSet] intoString:NULL];
                    }
                }
            }

            if ( [columns count] > 0 ) [rows addObject:columns];
        }
    }

    return rows;
}

参照: http://www.macresearch.org/cocoa-scientists-part-xxvi-parsing-csv-data

于 2013-01-23T04:21:00.970 に答える