将标题添加到CSV文件

时间:2014-05-07 23:35:21

标签: ios objective-c csv

我的iOS应用程序的一部分将包括导出.csv文件。

我已经创建了文件,并且按照我的意愿将数据添加到每一行。

我想添加标题行,因此如果文件通过电子邮件发送给某个人,他们就会知道每个列的用途。

我该如何实现这样的目标?

以下是我的csv代码:

- (NSString *)dataFilePath
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:@"myfile.csv"];
}

- (IBAction)save:(id)sender
{
    if (![[NSFileManager defaultManager] fileExistsAtPath:[self dataFilePath]]) {
        [[NSFileManager defaultManager] createFileAtPath: [self dataFilePath] contents:nil attributes:nil];
    }

    NSString * writeString = [NSString stringWithFormat:@"%@,%@,%@\n", self.nameTextField.text, self.cityTextField.text, self.stateTextField.text];

    NSFileHandle *handle;
    handle = [NSFileHandle fileHandleForWritingAtPath: [self dataFilePath]];
    [handle truncateFileAtOffset:[handle seekToEndOfFile]];
    [handle writeData:[writeString dataUsingEncoding:NSUTF8StringEncoding]];

    self.nameTextField.text = @"";
    self.cityTextField.text = @"";
    self.stateTextField.text = @"";

    [self.stateTextField resignFirstResponder];
}

问题2:

我如何写一行?目前,如果我更新任何UITextFields,则会添加新行。

2 个答案:

答案 0 :(得分:1)

CSV文件中的标题行只是第一行中的固定数据 - 由读取CSV文件的程序决定将第一行视为标题行 - Excel在文件打开/导入中有一个选项例如,对话框。

在您的代码中,您可以在首次创建文件时简单地编写标题 -

- (IBAction)save:(id)sender
{
    NSString *headerRow;
    if (![[NSFileManager defaultManager] fileExistsAtPath:[self dataFilePath]]) {
        [[NSFileManager defaultManager] createFileAtPath: [self dataFilePath] contents:nil attributes:nil];
        headerRow=@"name,city,state";
    }

    NSString * writeString = [NSString stringWithFormat:@"%@,%@,%@\n", self.nameTextField.text, self.cityTextField.text, self.stateTextField.text];

    NSFileHandle *handle;
    handle = [NSFileHandle fileHandleForWritingAtPath: [self dataFilePath]];
    [handle truncateFileAtOffset:[handle seekToEndOfFile]];
    if (headerRow != nil) {
        [handle writeData:[headerRow dataUsingEncoding:NSUTF8StringEncoding]];
    }
    [handle writeData:[writeString dataUsingEncoding:NSUTF8StringEncoding]];

    self.nameTextField.text = @"";
    self.cityTextField.text = @"";
    self.stateTextField.text = @"";

    [self.stateTextField resignFirstResponder];
}

答案 1 :(得分:0)

您需要知道向CSV文件添加内容使其不是CSV文件。如果您也是导入它的唯一导出,则导出注释将起作用 - 在这种情况下,它是基于CSV的自定义数据格式。 CSV有一个已定义的IETF标准 - RFC4180

要使其工作,您需要定义一些转义字符,通知您的格式解析器一行是注释。我建议"", - 这通常不会出现在符合RFC4180的CSV文件中。

实际上,在每个符合CSV的行之后添加注释行。在save:方法中,只有一行,因此只要保留RFC行的完整性,它就可以编写注释行,然后编写符合RFC的行或相反的顺序。如果您想要保存包含多行的较长字符串,则需要将保存的NSString拆分为

- (NSArray *)componentsSeparatedByString:(NSString *)separator

你的分隔符是“\ n”,然后遍历结果数组以写入每一行,根据需要添加注释。

如果您预处理文件并删除以特殊注释标记开头的行,则可以使用常规CSV解析器(如CHCSVParser)。同样,您需要通过换行符拆分传入的文件,并在尝试解析之前丢弃注释。

感谢CH {{{}} Dave DeLong!我经常使用它。