【问题标题】:Create csv file from array of data in iOS从 iOS 中的数据数组创建 csv 文件
【发布时间】:2012-04-24 12:44:46
【问题描述】:

我想将数据从 sql 文件写入 csv 文件。我已从数组中的 sql 文件收集所有数据,并使用 for 循环将数据附加并写入 .csv 文件。但似乎它仅在一行中显示数据,它不会转到新行来创建新行。 我已使用this 作为参考。 这是我的代码:

-(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]];      
    }    
}

【问题讨论】:

    标签: objective-c ios cocoa-touch ipad csv


    【解决方案1】:

    这只会写一行,因为每次执行循环时都会重写文件。在循环完成之前,最好不要在文件上writeData。我也会像这样使用 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]];
    }    
    

    【讨论】:

    • 嘿,您知道如何从 csv 文件中检索相同的数据吗? @Prernachavan
    • writeString = [writeString appendString: 不会通过编译,因为 writeString 返回 void。此外,在转储之前将所有文件内容放在内存中通常是个坏主意,因为它很容易被炸毁。
    • 你已经在使用NSMutableString,那为什么还要写writeString = [writeString appendString....,它打败了NSMutableString的目的。只需删除writeString =
    【解决方案2】:
    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];
    

    【讨论】:

      【解决方案3】:

      试试这个对我有用,

      如果有人想在 swift 3

      中创建 .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")
         }
        }
      

      更多详情可以参考Detail Answer

      希望这对某人有所帮助。

      【讨论】:

        【解决方案4】:
         // 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];
              });
         });
        

        【讨论】:

        • 感谢您的帮助,但有一些解释比一整块代码更好的答案
        • 代码完美运行!感谢您的回答和您的时间! -rrh
        猜你喜欢
        • 2011-02-06
        • 1970-01-01
        • 2011-03-19
        • 1970-01-01
        • 1970-01-01
        • 2017-01-24
        • 1970-01-01
        • 2017-10-14
        • 1970-01-01
        相关资源
        最近更新 更多