2010-07-27 7 views
37

मैं आईफोन पर उपयोग करने के लिए उद्देश्य-सी के लिए सीएसवी पार्सर का उपयोग करने में आसान हूं। मुझे यह कहां मिल सकता है?उद्देश्य-सी के लिए मुझे एनएसएआरएआरए पार्सर में सीएसवी कहां मिल सकता है?

मैं जेएसओएन जैसे अन्य पार्सर्स की भी तलाश कर रहा हूं, इसलिए शायद कहीं एक रूपांतरण लाइब्रेरी है। यह करने के लिए

उत्तर

50

मैं अंत में एक पार्सर मैं अपने कोड फ़ोल्डर में लिया है को साफ करने के लिए चारों ओर हो गया और Github पर पोस्ट किया: http://github.com/davedelong/CHCSVParser

यह काफी पूरी तरह से है। यह सभी प्रकार की भागने वाली योजनाओं, क्षेत्रों में नई लाइनों, टिप्पणियों आदि को संभालता है। यह बुद्धिमान फ़ाइल लोडिंग का भी उपयोग करता है, जिसका अर्थ है कि आप सीमित स्मृति स्थितियों में बड़ी फ़ाइलों को सुरक्षित रूप से पार्स कर सकते हैं।

+0

मैंने आपके द्वारा दिए गए गिथब लिंक की जांच की है, जैसे कि यह ठीक दिखता है लेकिन जब मैंने इसे आईफोन सिम्युलेटर में परीक्षण करने का प्रयास किया तो यह काम नहीं कर रहा है। सिम्युलेटर नहीं खुलता है। इसके अलावा बेस एसडीके मैक ओएस एक्स 10.5 पर सेट किया गया है। तो क्या यह आईफोन के लिए काम नहीं करेगा? क्या किया जाए? धन्यवाद। :) –

+1

@PARTH रीडेमे के सामान्य उपयोग अनुभाग में फ़ाइलों की एक सूची है। उन लोगों को अपनी परियोजना में कॉपी करें और '# आयात" CHCSV.h "' –

+0

धन्यवाद मेरे मूर्ख सवाल का जवाब देने के लिए डेव :) इसके अलावा मुझे लगता है कि हमें केवल arrayWithContentsofCSVFile: विधि का उपयोग करना होगा। सही? –

8

त्वरित तरीका:

NSString *dataStr = [NSString stringWithContentsOfFile:@"example.csv" encoding:NSUTF8StringEncoding error:nil];
NSArray *array = [dataStr componentsSeparatedByString: @","];

+1

यह ब्लॉक को संभालता नहीं है, हालांकि आपको अक्सर पूरी तरह से पुस्तकालय की आवश्यकता है :) – willcodejavaforfood

+0

मुझे आज की आवश्यकता नहीं है, लेकिन उस विधि/संदेश (?) –

0

मैं ParseKit कुछ सप्ताह पहले लेकिन IMHO ज्यादातर मामलों -[NSString componentsSeparatedByString:] विधि और NSScanner पर्याप्त और काफी का उपयोग करने के लिए आसान की तुलना में अधिक कर रहे हैं के लिए मिल गया है।

+0

धन्यवाद के बारे में जानना अच्छा है, थोड़ा जटिल दिखता है जो मैं खोज रहा हूं उसके लिए। –

3

मैंने एक परियोजना के लिए एक मृत-सरल (हालांकि पूरी तरह से फीचर्ड नहीं) सीएसवी पार्सर लिखा था: CSVFile.h और CSVFile.m। इसे पकड़ने के लिए स्वतंत्र महसूस करें - कोड जीपीएलवी 3 के तहत उपलब्ध है (दुर्भाग्यवश, यह उस परियोजना के लिए एक आवश्यकता थी जिस पर मैं काम कर रहा था) लेकिन मुझे एमआईटी लाइसेंस या किसी अन्य लाइसेंस के तहत आपको लाइसेंस देने में खुशी होगी।

1

यह अब तक का सबसे व्यापक लगता है।

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

एक तरफ ध्यान दें के रूप में, आप लगता है कि सबसे प्रमुख भाषाओं (डेल्फी, सी #, ऑब्जेक्टिव-सी, php आदि) एक पुस्तकालय इस बुनियादी डाटा इंटरचेंज प्रारूप की एक पूरी कार्यान्वयन के साथ उपलब्ध होगा।

मुझे पता है कि जेसन शांत है और एक्सएमएल विश्वसनीय है लेकिन न ही अधिकांश अनुप्रयोगों को सहेजने वाले तालिका डेटा से सहेजने के विकल्प के रूप में उपलब्ध हैं। सीएसवी अभी भी है।

-2

जैसा कि एक्सएमआर ने ऊपर कहा है: उद्देश्य सी में एनएसएसटींग सीएसवी को 'स्ट्रिंग द्वारा अलग किए गए घटकों' में परिवर्तित करने के लिए संभव है।

NSArray* items; 
    items=[bufferString componentsSeparatedByString:@","];  

मामले में आप सीएसवी निर्यात में रुचि रखते हैं इस सूत्र पर पहुंचे होने - के रूप में मैंने किया था - यहाँ कैसे मैं एक csv फ़ाइल निर्यात के एक उद्धरण है।

NSString* fileName = @"Level"; 
    fileName = [fileName stringByAppendingString:levelNumberBeingEdited]; 
    fileName = [fileName stringByAppendingString:@".txt"]; 
    NSString* [email protected]""; 

बफर स्ट्रिंग प्रत्येक डेटा मद (नहीं दिखाया गया है) और प्रत्येक के बीच में कॉमा डालने के माध्यम से पाशन की आबादी है। अंत में यह निर्यात किया जाता है।

NSString* homeDir = NSHomeDirectory(); 
    NSString* fullPath = [homeDir stringByAppendingPathComponent:fileName]; 
    NSError* error = nil; 
    [bufferString writeToFile:fullPath atomically:NO encoding:NSASCIIStringEncoding error:&error]; 
+7

-1 जो ​​कुछ भी है, यह सीएसवी फाइलों को पार्स करने का उत्तर नहीं है। चिह्नित किया गया। –

+1

मैंने अपना जवाब संपादित कर लिया है। मुझे इस धागे का नेतृत्व किया गया और एक्सएमआर ने मेरी समस्या हल की। मैंने सोचा कि यह दिखाने के लिए उपयोगी होगा कि असली सीएसवी टेक्स्ट फ़ाइल उसके समाधान में कैसे फिट बैठती है। –

5

ठीक है, सरल समाधानों के ऊपर एकाधिक रिकॉर्ड नहीं लेते हैं।

NSString *content = [NSString stringWithContentsOfFile:filepath encoding:NSUTF8StringEncoding error:nil]; 
NSArray *contentArray = [content componentsSeparatedByString:@"\r"]; // CSV ends with ACSI 13 CR (if stored on a Mac Excel 2008) 

for (NSString *item in contentArray) { 
    NSArray *itemArray = [item componentsSeparatedByString:@";"]; 
    // log first item 
    NSLog(@"%@",[itemArray objectAtIndex:0]); 
} 
+0

आपको यह विचार करना होगा कि यह सरल फ़ाइलों के लिए काम कर सकता है, यह कई परिदृश्यों में काम नहीं करेगा। ऐसे मामले हैं जहां आप अल्पविराम से बच सकते हैं, या जब आप कोटेशन के अंदर मूल्य डालते हैं। घटक SeparatedByString इनमें से कोई भी पकड़ नहीं होगा। ऐसे परिदृश्य भी होते हैं जब सेल मान में एक नई रेखा हो सकती है, इसलिए इन परिदृश्यों में, आपकी सामग्री सरणी या तो सटीक नहीं होगी। यही कारण है कि अन्य लोग सीएचसीएसवी पार्सर जैसे पुस्तकालयों का उपयोग करने की सिफारिश कर रहे हैं। ये इन सभी परिदृश्यों को संभालने के लिए बनाए गए हैं। – Rob

17

यहाँ NSString पर एक साधारण श्रेणी के एक सीएसवी स्ट्रिंग बोली ब्लॉक के अंदर एम्बेडेड के लिए अल्पविराम है कि पार्स करने के लिए है: निम्नलिखित कोड एक डिफ़ॉल्ट Excel CSV पढ़ने लाइन अंत मार्कर के रूप में एएससीआई 13 का उपयोग कर का उपयोग करें।

#import "NSString+CSV.h" 

@implementation NSString (CSV) 

- (NSArray *)componentsSeparatedByComma 
{ 
    BOOL insideQuote = NO; 
    NSMutableArray *results = [[NSMutableArray alloc] init]; 
    NSMutableArray *tmp = [[NSMutableArray alloc] init]; 

    for (NSString *s in [self componentsSeparatedByString:@","]) { 
     if ([s rangeOfString:@"\""].location == NSNotFound) { 
      if (insideQuote) { 
       [tmp addObject:s]; 
      } else { 
       [results addObject:s]; 
      } 
     } else { 
      if (insideQuote) { 
       insideQuote = NO; 
       [tmp addObject:s]; 
       [results addObject:[tmp componentsJoinedByString:@","]]; 
       tmp = nil; 
       tmp = [[NSMutableArray alloc] init]; 
      } else { 
       insideQuote = YES; 
       [tmp addObject:s]; 
      } 
     } 
    } 

    return results; 
} 

@end 

इसका मतलब यह है कि आप अपनी CSV पहले से ही एक सरणी में दाखिल पढ़ा है:

myArray = [myData componentsSeparatedByString:@"\n"]; 

कोड बच गए उद्धरण के लिए खाते में नहीं है, लेकिन यह आसानी से करने के लिए बढ़ाया जा सकता है।

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