मैं डेव डीलॉन्ग के उत्कृष्ट CHCSVParser के साथ ऑब्जेक्टिव-सी के लिए बहुत ही लंबे समय से सीएसवी फ़ाइल के साथ खेल रहा हूं और इसका उपयोग कर कुछ परेशानी में भाग रहा हूं। मैं arrayWithContentsOfCSVFile
विधि का उपयोग करूंगा, लेकिन मैं एक आईफोन पर कोड चला रहा हूं और पूरी फाइल को स्मृति में पार्स कर रहा हूं, यह उपलब्ध होने से अधिक मेमोरी लेगा।CHCSVParser क्लास का उपयोग कैसे करें
नीचे दिए गए मेरे कोड में, पार्सर दस्तावेज़ खोलता है और प्रतिनिधि विधियों को पूरी तरह से कॉल करता है, लेकिन जहां प्रतिनिधि में मैं प्रत्येक पंक्ति के बाद रुक जाता हूं और डेटा तक पहुंचता हूं (डेटा स्टोर पर कोर डेटा ऑब्जेक्ट बनाने और सहेजने के लिए) ? मुझे लगता है कि - (void) parser:(CHCSVParser *)parser didEndLine:(NSUInteger)lineNumber
में होगा, लेकिन मुझे लाइन के साथ किए जाने पर पार्सर से डेटा के NSArray
(या जो भी) प्राप्त हो सकता है?
//
// The code from a method in my view controller:
//
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSFileManager *manager = [NSFileManager defaultManager];
NSError *err = nil;
NSArray *fileList = [manager contentsOfDirectoryAtPath:documentsDirectory error:&err];
NSString *fileName = [fileList objectAtIndex:1];
NSURL *inputFileURL = [NSURL fileURLWithPath: [documentsDirectory stringByAppendingPathComponent:fileName]];
NSStringEncoding encoding = 0;
CHCSVParser *p = [[CHCSVParser alloc] initWithContentsOfCSVFile:[inputFileURL path] usedEncoding:&encoding error:nil];
[p setParserDelegate:self];
[p parse];
[p release];
...
#pragma mark -
#pragma mark CHCSVParserDelegate methods
- (void) parser:(CHCSVParser *)parser didStartDocument:(NSString *)csvFile {
NSLog(@"Parser started!");
}
- (void) parser:(CHCSVParser *)parser didStartLine:(NSUInteger)lineNumber {
//NSLog(@"Parser started line: %i", lineNumber);
}
- (void) parser:(CHCSVParser *)parser didEndLine:(NSUInteger)lineNumber {
NSLog(@"Parser ended line: %i", lineNumber);
}
- (void) parser:(CHCSVParser *)parser didReadField:(NSString *)field {
//NSLog(@"Parser didReadField: %@", field);
}
- (void) parser:(CHCSVParser *)parser didEndDocument:(NSString *)csvFile {
NSLog(@"Parser ended document: %@", csvFile);
}
- (void) parser:(CHCSVParser *)parser didFailWithError:(NSError *)error {
NSLog(@"Parser failed with error: %@ %@", [error localizedDescription], [error userInfo]);
}
धन्यवाद:
यहाँ मेरी कोड अब तक है!
उत्तर के लिए धन्यवाद - मैं यह नहीं बता सका कि पार्सर ने आपके लिए यह काम किया है ('currentChunk' या किसी अन्य तरीके से)! यह अच्छा होगा कि मैन्युअल रूप से एकत्रीकरण नहीं करना पड़ेगा, लेकिन अधिकांश ऐप्स के लिए सीएसवी पार्सिंग केवल आई/ओ के लिए कुछ स्थानों में उपयोग की जाती है। अगर कोई उस कोड को थोड़ा सा लिखना चाहता था, तो क्या यह सबक्लास होना संभव होगा या CHCSVParserDelegate पर एक श्रेणी लिखें? –
@Neal 'CHCSVParserDelegate' एक प्रोटोकॉल है, इसलिए आप इसे उपclass नहीं कर सकते हैं। इस व्यवहार को काम करने के लिए, आपको सीधे 'CHCSVParser' को बदलना होगा या इसे उपclass करना होगा। सबसे आसान जवाब लाइन को स्वयं जोड़ना है (जैसे मैं जवाब में करता हूं) –
ऐसा नहीं सोचा था ... अच्छा काम यहाँ अद्भुत काम के लिए बहुत बहुत धन्यवाद! असल में आपके कोड में मामूली सुधार ... 'didEndLine' में हमें 'currentLine' को' currentRow 'में बदलने की आवश्यकता है। (मैं इसे बदल दूंगा लेकिन पर्याप्त एक्सपी नहीं है;)) –