2010-08-09 20 views
6

我在寫一個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

回答

17

的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

17
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

0

更好的方法是使用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: