6

I will like to use CHCSVParser to export my Core data to CSV. I know how to get all the value from entity, but I don't know how to write to CSV.

Can anybody teach me how to write to CSV with CHCSVParser?

// Test listing all Infos from the store
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"NoteLog" inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
for (NoteLog *noteInfo in fetchedObjects) {

    NSLog(@"Name: %@", noteInfo.city );
    NSLog(@"Name: %@", noteInfo.country);
    NSLog(@"Name: %@", noteInfo.datetime);
    NSLog(@"Name: %@", noteInfo.notelatitude);
    NSLog(@"Name: %@", noteInfo.notelongtitude);
    NSLog(@"Name: %@", noteInfo.state);
    NSLog(@"Name: %@", noteInfo.text);        
}  
Lorenzo B
  • 33,216
  • 24
  • 116
  • 190
Desmond
  • 5,001
  • 14
  • 56
  • 115

2 Answers2

8

A CHCSVWriter has several methods for constructing CSV files:

-writeField: accepts an object and writes its -description (after being properly escaped) out to the CSV file. It will also write field seperator (,) if necessary. You may pass an empty string (@"") or nil to write an empty field.

-writeFields: accepts a comma-delimited and nil-terminated list of objects and sends each one to -writeField:.

-writeLine is used to terminate the current CSV line. If you do not invoke -writeLine, then all of your CSV fields will be on a single line.

-writeLineOfFields: accepts a comma-delimited and nil-terminated list of objects, sends each one to -writeField:, and then invokes -writeLine.

-writeLineWithFields: accepts an array of objects, sends each one to -writeField:, and then invokes -writeLine.

-writeCommentLine: accepts a string and writes it out to the file as a CSV-style comment.

In addition to writing to a file, CHCSVWriter can be initialized for writing directly to an NSString.

Something Like this should work for you.

CHCSVWriter *writer = [[CHCSVWriter alloc] initForWritingToString];

for (NoteLog *noteInfo in fetchedObjects) {

    [writer writeLineOfFields:noteInfo.city, noteInfo.country, noteInfo.datetime, noteInfo.notelatitude, noteInfo.notelongtitude, noteInfo.state, noteInfo.text, nil];     
}  

NSLog(@"My CSV File: %@",writer.stringValue);
Ryan Poolos
  • 18,421
  • 4
  • 65
  • 98
  • hi Rayan, Will you beable to give me an example ? all i need is the to export all the data out and thats it – Desmond May 13 '12 at 14:42
  • 2
    Added some code for your particular case. If you paste that in you should get a nice CSV output in your console. From there I trust you know how to put it in a file and do whatever you want with it. – Ryan Poolos May 13 '12 at 15:24
  • 2
    Glad to hear :) Happy coding. – Ryan Poolos May 14 '12 at 12:27
  • hi i was trying your code but seems that "initForWritingToString" has been replaced in CHCSVParser. can u help me out. I have the same issue – user1489709 Jan 26 '13 at 11:42
  • It no longer writes to a string. Now it only writes directly to a path. `initForWritingToCSVFile:(NSString *)path` So just give it a path where you'd like your CSV file saved. You could store it somewhere temporary and read it to a string using `stringWithContentsOfFile:` if you really need it in a string. – Ryan Poolos Jan 26 '13 at 14:39
8

The answer above seems to be deprecated, the author replaced the method with another it seem. This worked for me, hope it helps:

NSOutputStream *stream = [[NSOutputStream alloc] initToMemory];
CHCSVWriter *writer = [[CHCSVWriter alloc] initWithOutputStream:stream encoding:NSUTF8StringEncoding delimiter:','];

for (Type *instance in fetchedResults) {
    [writer writeLineOfFields:@[instance.propertyA, instance.B]];
}
[writer closeStream];

NSData *buffer = [stream propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
NSString *output = [[NSString alloc] initWithData:buffer encoding:NSUTF8StringEncoding];
Mic Fok
  • 837
  • 11
  • 12