我的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
,则会添加新行。
答案 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!我经常使用它。