如何将iPhone上的NSMutableArray转换为CSV文件?

如何将iPhone上的NSMutableArray转换为CSV文件?

问题描述:

我在写一个iPhone应用程序,它包含一个函数。它可以将NSMutableArray转换为CSV文件。但是,我不知道该怎么做。任何人都可以帮助我做到这一点?非常感谢你。如何将iPhone上的NSMutableArray转换为CSV文件?

// ------更新-----

谢谢大家的回复。

实际上,数组包含元素的对象,但我可以将它全部修改为像下面这样的数组(我猜这样做更容易)。

数组是NSMutableArray * csvArray,数组包含数据,如下例所示。

csvArray[0] = First Name 
csvArray[1] = Last Name 
csvArray[2] = Phone 
csvArray[3] = Tom 
csvArray[4] = Chan 
csvArray[5] = 123 
csvArray[6] = Peter 
csvArray[7] = Wong 
csvArray[8] = 456 
csvArray[9] = Mary's 
csvArray[10] = Cho"w 
csvArray[11] = 789... 

数组开头有3个选项卡,它们是名字,姓氏和电话号码。对于数据,它也包含“和,符号,因此,我不能只由‘’符号切割阵列。

格式我想输出是以下

//--------------------------- 

First Name, Last Name, Phone // <- it have the \r\n between each row of data 
Tom, Chan, 123 
Peter, Wong, 456 
Mary's, Cho"w, 789 ... 

//--------------------------- 
+1

没有足够的信息来回答。我们需要知道数组中的内容。您希望输出CSV格式的格式。 – 2010-08-09 02:18:36

+2

@Aran“您希望输出CSV格式的格式”?你意识到CSV *是一种格式,对吧? – 2010-08-09 03:26:47

+0

@Dave:如果数组是一个具有多个字段的复杂对象的数组,而不仅仅是字符串,那么怎么办?例如:具有给定名称,姓氏,出生日期等的Person类的数组....“我是否意识到CSV是一种格式”...是的,我确实,CSV通过逗号分隔来定义伪列,所以什么格式=>文件中的列/字段.. – 2010-08-09 05:11:21

的CSV分析器我写的(http://github.com/davedelong/CHCSVParser )可以将CSV文件解析为NSArray的NSArray(如果使用的话)包含在代码中的NSArray类别),并且我只是在该类别中添加了一个方法来获取这些数组中的一个并将其写回CSV文件。

所以,如果你有NSArraysNSArray,那么你可以把它写入一个CSV文件是这样的:

[myArray writeToCSVFile:myCSVFile atomically:YES]; 

如果,如果你不通过NSArrays的一个NSArray会优雅地失败。

编辑(根据@Aran对该问题的评论提示)子阵列内的任何对象都将其-description方法写入CSV文件。如果要将一系列对象写入文件中,并使用各种属性作为CSV行的字段,则我的包装需要将属性放置在数组中,然后该数组将构成该行。

编辑#2我刚刚更新了我的CSV解析器,以重构写入它自己的类。现在,您可以执行以下操作:

CHCSVWriter * csvWriter = [[CHCSVWriter alloc] initWithCSVFile:outputFile atomic:NO]; 
NSInteger numberOfColumns = 3; 
for (NSInteger currentIndex = 0; currentIndex < [csvArray count]; currentIndex++) { 
    id field = [csvArray objectAtIndex:currentIndex]; 
    [csvWriter writeField:field]; 
    if ((currentIndex % numberOfColumns) == (numberOfColumns - 1)) { 
    [csvWriter writeLine]; 
    } 
} 
[csvWriter release]; 

那会写你的csvArray到其路径是outputFile的文件,该文件将是这样的:

First Name,Last Name,Phone 
Tom,Chan,123 
Peter,Wong,456 
Mary's,"Cho""w",789 
+0

@Dave DeLong,谢谢你的回复。我已更新该帖子。你介意看看吗?谢谢。 – Questions 2010-08-09 09:54:05

+0

@MarkSiu更新回答 – 2010-08-09 20:32:27

+0

@Dave DeLong,谢谢你的回复。这非常有用。但是有可能使用代码而不是创建一个名为'CHCSVWriter'的对象吗?因为我不能使用它。谢谢。 – Questions 2010-08-10 01:27:00

NSString *csv = [myArray componentsJoinedByString: @","]; 

但要注意,这将不考虑数组的元素中的逗号。您需要定义一些转义/转义技术,而这完全取决于你做的。

+0

除非数组填充字符串(在这种情况下,它仅生成单行CSV文件),否则这种方法工作得不是很好。如果它包含字典或其他数组,那么输出结果将不可取。 – dreamlax 2010-08-09 04:02:24

+0

嗯,但原始的海报有一个可能的问题,所以我给出了最通用的可能答案。 :) – 2010-08-09 05:10:26

+0

感谢您的回复。由于行由'\ r \ n'分隔,我不能简单地使用componentsJoinedByString来解决这个问题。 – Questions 2010-08-09 09:49:59

更好的方法是使用XLSX,而不是CSV。 ..很容易:

您可以使用XlsxReaderWriter库...它是免费的,有用的阅读&写!

  • 创建一个新的项目或打开现有项目
  • 插入XlsxReaderWriter.xcodeproj作为项目的一个子项目
  • 在你的目标构建阶段插入XlsxReaderWriter作为目标依赖
  • 添加libXlsxReaderWriter.a和链接二进制库中的libz.tbd。较老的系统可以使用libz.dylib而不是libz.tbd。
  • 在项目设置中的链接/其他链接器标志中添加-all_load
  • 将XlsxReaderWriter根目录路径添加到用户标题搜索路径并将其设置为递归。例如,将路径设置为“$(SRCROOT)/ XlsxReaderWriter /”,而不是“$(SRCROOT)/ XlsxReaderWriter/XlsxReaderWriter /”。

现在,您可以在代码中导入BRAOfficeDocumentPackage.h。

它也支持Swift: