2012-12-06 46 views
0

我有一个包含一些数据(具有多列和多行)的excel文件。我想将这些数据导入基于核心数据的数据库。我努力导入数据,因为单元格中的文本包含换行符。如何在单元格文本中导入包含换行符的excel文件

我已经试过如下:

1)导出Excel为制表符分隔文本文件

2)写的iOS导入路由使用以下读取制表符分隔文本文件代码:

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

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

问题:我有1000 rows与每个15 columns。解析例程返回多于1000个rows并且少于15个columns。解析程序没有正确处理单元格中的换行符。

我得到同样的结果,如果我用

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

[NSCharacterSet characterSetWithCharactersInString:@"\r"];

,而不是

[NSCharacterSet newlineCharacterSet]

但Ç如果我使用

[NSCharacterSet characterSetWithCharactersInString:@"\n"];

我怎样才能正确地分析Excel的数据ompletely失败?

也许我可以使用正则表达式来获取线组件?任何想法/指针?

UPDATE(样品XLSX和导出文件):为我工作

Sample XLSX File Sample TAB Delimited Text File

+0

你能告诉什么样的TSV文件看起来像换行** **里面一排的例子吗? – borrrden

+0

值中有换行符的CSV/TSV值将用引号引起来。包含字段分隔符的值也将用引号引起来。您无法通过简单的分隔符分割文本来正确解析CSV/TSV文件。你需要处理引用的值。正确解析CSV/TSV文件涉及大多数人的想法。 – rmaddy

+0

已编辑,包括示例XLSX和导出文件屏幕截图。 – Mustafa

回答

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

相关问题