2010-08-09 10 views
6

मैं एक आईफोन एप्लीकेशन लिख रहा हूं, जिसमें एक फ़ंक्शन शामिल है। यह एनएसएमयूटेबलएरे को एक सीएसवी फ़ाइल में परिवर्तित कर सकता है। हालांकि, मुझे नहीं पता कि कैसे करना है। क्या कोई मुझे ऐसा करने में मदद कर सकता है? आपका बहुत बहुत धन्यवाद।आईएसएम पर एनएसएमयूटेबलएरे से सीएसवी फ़ाइल को कैसे परिवर्तित करें?

// ------ अपडेट -----

हर किसी को जवाब के लिए धन्यवाद।

दरअसल, सरणी में तत्वों की वस्तुएं होती हैं, लेकिन मैं इसे सभी को सरणी में समझा सकता हूं (मुझे लगता है कि यह करना अधिक आसान है)।

सरणी एनएसएमयूटेबलएरे * सीएसवीएरे है और सरणी में निम्नलिखित उदाहरण की तरह डेटा शामिल है।

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

उत्तर देने के लिए पर्याप्त जानकारी नहीं है। हमें पता होना चाहिए कि सरणी में क्या है। आउटपुट सीएसवी में आप किस प्रारूप में होना चाहते हैं। –

+2

@Aran "आउटपुट सीएसवी में आप किस प्रारूप में होना चाहते हैं"? आप महसूस करते हैं कि सीएसवी * एक प्रारूप है, है ना? –

+0

@ डेव: क्या होगा यदि सरणी कई क्षेत्रों के साथ जटिल वस्तुओं की एक सरणी है, न केवल तारों। उदाहरण के लिए: दिए गए नाम, अंतिम नाम, जन्मदिन, आदि के साथ वर्ग व्यक्ति की एक सरणी .... "क्या मुझे एहसास है कि सीएसवी एक प्रारूप है" .... हाँ मैं करता हूं, सीएसवी अल्पविराम अलगाव के माध्यम से छद्म कॉलम को परिभाषित करता है, तो प्रारूप => फ़ाइल में कौन से कॉलम/फ़ील्ड .. –

उत्तर

17

सीएसवी पार्सर मैंने लिखा (http://github.com/davedelong/CHCSVParser) एनएसएआरआरएएस के एनएसएआरएआरई में सीएसवी फाइलों को पार्स कर सकते हैं (यदि आप इसका उपयोग करते हैं NSArray श्रेणी कोड के साथ शामिल है), और मैंने श्रेणी में एक सरणी को लेने के लिए श्रेणी में एक विधि जोड़ा और इसे एक CSV फ़ाइल में वापस लिख दिया।

तो अगर आप NSArrays के NSArray है, तो आप इसे एक CSV इस तरह दर्ज करने के लिए लिख सकते हैं:

[myArray writeToCSVFile:myCSVFile atomically:YES]; 

अगर आप NSArrays का एक NSArray उत्तीर्ण नहीं होते हैं शान से असफल हो जायेगी।

संपादित करें (उपरोक्त के अंदर @ अरन की टिप्पणी द्वारा प्रेरित) उपरोक्त के अंदर किसी ऑब्जेक्ट में -description विधि CSV फ़ाइल में लिखी जाएगी। यदि आप फ़ाइल में ऑब्जेक्ट्स की एक श्रृंखला लिखना चाहते हैं, तो CSV पंक्ति के फ़ील्ड के रूप में विभिन्न गुणों के साथ, तो मेरे रैपर की आवश्यकता होती है कि गुण सरणी में रखा जाए, और फिर वह सरणी पंक्ति को बनाएगी।

संपादित करें # 2 मैंने अपने सीएसवी पार्सर को अपनी खुद की कक्षा में लिखने के लिए अभी अपडेट किया है। अब आप निम्न कर सकते हैं:

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

@ डेव डीलॉन्ग, आपके उत्तर के लिए धन्यवाद। और मैंने पोस्ट अपडेट किया है। क्या आप एक नज़र रखना चाहते हैं। धन्यवाद। – Questions

+0

@MarkSiu अद्यतन उत्तर –

+0

@ डेव डीलॉन्ग, आपके उत्तर के लिए धन्यवाद। यह बहुत उपयोगी है। लेकिन क्या 'CHCSVWriter' नामक ऑब्जेक्ट बनाने के बजाय कोड का उपयोग करना संभव है? जैसा कि मैं इसका उपयोग नहीं कर सकता। धन्यवाद। – Questions

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

लेकिन चेतावनी दी, इस सरणी के तत्वों के भीतर अल्पविराम के लिए खाते में जाएगा नहीं। आप उस के लिए कुछ एस्केपिंग/न छोड़ने तकनीक को परिभाषित करने की आवश्यकता होगी, और कहा कि ऐसा करने के लिए आप पर निर्भर करता है।

+0

यह तब तक अच्छी तरह से काम नहीं करेगा जब तक कि सरणी स्ट्रिंग के साथ आबादी न हो (जिस स्थिति में यह केवल एकल पंक्ति वाली CSV फ़ाइल उत्पन्न करता है)। यदि इसमें शब्दकोश या अन्य सरणी शामिल हैं तो आउटपुट बिल्कुल वांछनीय नहीं होगा। – dreamlax

+0

वैसे हाँ, लेकिन मूल पोस्टर के पास सबसे संभावित प्रश्न था, इसलिए मैंने सबसे सामान्य संभावित उत्तर दिया। :) –

+0

आपके उत्तर के लिए धन्यवाद। चूंकि पंक्तियां '\ r \ n' से अलग होती हैं, इसलिए मैं इस समस्या को हल करने के लिए घटक जॉइनडब्रिस्ट्रिंग का उपयोग नहीं कर सकता। – Questions

0

बेहतर दृष्टिकोण उपयोग xlsx बजाय सीएसवी है। .. यह आसान है:

आप XlsxReaderWriter लाइब्रेरी का उपयोग कर सकते हैं ... यह & पढ़ने के लिए मुफ्त और उपयोगी है!

  • कोई नया प्रोजेक्ट बनाएं या अपनी परियोजना के एक उप परियोजना के रूप में एक मौजूदा परियोजना
  • सम्मिलित XlsxReaderWriter.xcodeproj खोलने
  • अपने लक्ष्य चरणों बिल्ड में लक्ष्य निर्भरता
  • libXlsxReaderWriter.a के रूप में जोड़ें XlsxReaderWriter सम्मिलित और पुस्तकालयों के साथ लिंक बाइनरी में libz.tbd। पुराने सिस्टम libz.tbd के बजाय libz.dylib का उपयोग कर सकते हैं।
  • अपनी परियोजना सेटिंग्स में लिंकिंग/अन्य लिंकर ध्वज में जोड़ें -all_load
  • उपयोगकर्ता शीर्षलेख खोज पथ में XlsxReaderWriter रूट निर्देशिका पथ जोड़ें और इसे रिकर्सिव के रूप में सेट करें। उदाहरण के लिए, पथ को "$ (SRCROOT)/XlsxReaderWriter /", "$ (SRCROOT)/XlsxReaderWriter/XlsxReaderWriter /" पर सेट करें।

अब, आप अपने कोड में BRAOfficeDocumentPackage.h आयात कर सकते हैं।

यह स्विफ्ट का समर्थन करता है:

संबंधित मुद्दे