在iOS中从数据数组创buildcsv文件

我想从sql文件写入数据到csv文件。 我已经从一个数组中的sql文件中收集所有数据,并使用for循环我附加和写入数据到.csv文件。 但它似乎只显示一行中的数据,只是不去新行创build新行。 我已经使用这个参考。 这是我的代码:

-(NSString *)dataFilePath { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; return [documentsDirectory stringByAppendingPathComponent:@"myfile.csv"]; } - (IBAction)saveAsFileAction:(id)sender { if (![[NSFileManager defaultManager] fileExistsAtPath:[self dataFilePath]]) { [[NSFileManager defaultManager] createFileAtPath: [self dataFilePath] contents:nil attributes:nil]; NSLog(@"Route creato"); } NSString *writeString; for (int i=0; i<[dataArray count]; i++) { writeString = [NSString stringWithFormat:@"%@, %@, %@, %@, %0.2f,",[[dataArray objectAtIndex:i]dates],[[dataArray objectAtIndex:i] time],[[dataArray objectAtIndex:i] category],[[dataArray objectAtIndex:i]place],[[dataArray objectAtIndex:i] amount]]; NSLog(@"writeString :%@",writeString); NSFileHandle *handle; handle = [NSFileHandle fileHandleForWritingAtPath: [self dataFilePath] ]; //say to handle where's the file fo write [handle truncateFileAtOffset:[handle seekToEndOfFile]]; //position handle cursor to the end of file [handle writeData:[writeString dataUsingEncoding:NSUTF8StringEncoding]]; } } 

这只写一行,因为每次你通过你的循环重写文件。 在循环完成之前,最好不要在文件上写入数据。 我也会这样使用一个NSMutableString:

 - (IBAction)saveAsFileAction:(id)sender { if (![[NSFileManager defaultManager] fileExistsAtPath:[self dataFilePath]]) { [[NSFileManager defaultManager] createFileAtPath: [self dataFilePath] contents:nil attributes:nil]; NSLog(@"Route creato"); } NSMutableString *writeString = [NSMutableString stringWithCapacity:0]; //don't worry about the capacity, it will expand as necessary for (int i=0; i<[dataArray count]; i++) { writeString = [writeString appendString:[NSString stringWithFormat:@"%@, %@, %@, %@, %0.2f, \n",[[dataArray objectAtIndex:i]dates],[[dataArray objectAtIndex:i] time],[[dataArray objectAtIndex:i] category],[[dataArray objectAtIndex:i]place],[[dataArray objectAtIndex:i] amount]]]; //the \n will put a newline in } } //Moved this stuff out of the loop so that you write the complete string once and only once. NSLog(@"writeString :%@",writeString); NSFileHandle *handle; handle = [NSFileHandle fileHandleForWritingAtPath: [self dataFilePath] ]; //say to handle where's the file fo write [handle truncateFileAtOffset:[handle seekToEndOfFile]]; //position handle cursor to the end of file [handle writeData:[writeString dataUsingEncoding:NSUTF8StringEncoding]]; } 
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); NSString *documentsDir = [paths objectAtIndex:0]; NSString *root = [documentsDir stringByAppendingPathComponent:@"customers.csv"]; NSString *temp; temp = [NSString stringWithFormat:@"%@", [arrCustomersName objectAtIndex:0]]; for (int i = 1; i < [arrCustomersName count]; i++) { temp = [temp stringByAppendingFormat:@", %@", [arrCustomersName objectAtIndex:i]]; } [temp writeToFile:root atomically:YES encoding:NSUTF8StringEncoding error:NULL]; 

代替 :

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); NSString *documentsDir = [paths objectAtIndex:0]; NSString *root = [documentsDir stringByAppendingPathComponent:@"customers.csv"]; 

… 写吧 :

 NSString *root = [NSHomeDirectory() stringByAppendingPathComponent:@"customers.csv"]; 

只有一行代码的结果完全相同。 ; O)

  // For CSV File : NSMutableString *stringToWrite = [[NSMutableString alloc] init]; [stringToWrite appendString:[NSString stringWithFormat:@"First Name,Last Name,Full Name,Phone Number, Email,Job, organizationName,Note\n\n"]]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ for(int i = 0 ;i<[Contact count];i++) { [stringToWrite appendString:[NSString stringWithFormat:@"%@,",[[Contact objectAtIndex:i] valueForKey:@"firstName"] ]]; [stringToWrite appendString:[NSString stringWithFormat:@"%@,",[[Contact objectAtIndex:i] valueForKey:@"lastName"] ]]; [stringToWrite appendString:[NSString stringWithFormat:@"%@,",[[Contact valueForKey:@"userName"] objectAtIndex:i]]]; [stringToWrite appendString:[NSString stringWithFormat:@"%@,",[[Contact objectAtIndex:i] valueForKey:@"phoneNumber"] ]]; [stringToWrite appendString:[NSString stringWithFormat:@"%@,",[[Contact objectAtIndex:i] valueForKey:@"emailAddress"] ]]; [stringToWrite appendString:[NSString stringWithFormat:@"%@,",[[Contact objectAtIndex:i] valueForKey:@"jobTitle"] ]]; [stringToWrite appendString:[NSString stringWithFormat:@"%@,",[[Contact objectAtIndex:i] valueForKey:@"organizationName"] ]]; [stringToWrite appendString:[NSString stringWithFormat:@"%@\n",[[Contact objectAtIndex:i] valueForKey:@"note"] ]]; } dispatch_async(dispatch_get_main_queue(), ^(void) { NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *documentDirectory=[paths objectAtIndex:0]; NSString *strBackupFileLocation = [NSString stringWithFormat:@"%@/%@", documentDirectory,@"ContactList.csv"]; [stringToWrite writeToFile:strBackupFileLocation atomically:YES encoding:NSUTF8StringEncoding error:nil]; }); }); 

试试这是为我工作,

如果有人想在swift 3中创build.csv文件

  // MARK: CSV file creating func creatCSV() -> Void { let fileName = "Tasks.csv" let path = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(fileName) var csvText = "Date,Task Name,Time Started,Time Ended\n" for task in taskArr { let newLine = "\(task.date),\(task.name),\(task.startTime),\(task.endTime)\n" csvText.append(newLine) } do { try csvText.write(to: path!, atomically: true, encoding: String.Encoding.utf8) } catch { print("Failed to create file") print("\(error)") } print(path ?? "not found") } } 

有关更多详细信息,请参阅详细答案

希望这对一些人有帮助。