【问题标题】:Stop writing blank line at the end of CSV file (using MATLAB)停止在 CSV 文件末尾写入空行(使用 MATLAB)
【发布时间】:2010-05-18 15:06:25
【问题描述】:

我正在使用 MATLAB 打开一批包含列标题和数据的 CSV 文件(使用 importdata 函数),然后我稍微操作数据并使用 @987654322 将标题和数据写入新的 CSV 文件@ 功能。我正在使用dlmwrite-appendnewline 属性在新行上添加每一行文本/数据。

我的每个新 CSV 文件的末尾都有一个空行,而在我读入数据之前,这个空行不存在……而且我在最后一次调用 @987654327 时没有使用 newline @。

有谁知道如何避免将这个空白行写到 CSV 文件的末尾?


编辑于 2010 年 5 月 18 日下午 1:35 CST

添加了有关每个请求的代码和文本文件的信息...在执行以下过程后,您会注意到新文本文件的最后一行的末尾似乎有一个回车符。

考虑一个名为“textfile.txt”的文本文件,如下所示:

Column1, Column2, Column3, Column4, Column 5
1, 2, 3, 4, 5
1, 2, 3, 4, 5
1, 2, 3, 4, 5
1, 2, 3, 4, 5
1, 2, 3, 4, 5

这是我正在使用的代码示例:

% import data
importedData = importdata('textfile.txt');

% manipulate data
importedData.data(:,1) = 100;

% store column headers into single comma-delimited
% character array (for easy writing later)
columnHeaders = importedData.textdata{1};
for counter = 2:size(importedData.textdata,2)
    columnHeaders = horzcat(columnHeaders,',',importedData.textdata{counter});
end

% write column headers to new file
dlmwrite('textfile_updated.txt',columnHeaders,'Delimiter','','newline','pc')

% append all but last line of data to new file
for dataCounter = 1:(size(importedData.data,2)-1)
    dlmwrite('textfile_updated.txt',importedData.data(dataCounter,:),'Delimiter',',','newline','pc','-append')
end

% append last line of data to new file, not
% creating new line at end
dlmwrite('textfile_updated.txt',importedData.data(end,:),'Delimiter',',','-append')

【问题讨论】:

  • 您能否在此处展示您的代码的简单版本,其中包含我们可以存储为文件以进行复制的数据?
  • 嗯,我的代码没有问题。而且我最好将所有 dlmwrite 的“换行符”选项保留相同(并避免 for 循环)。我认为关键是——你使用什么操作系统来运行代码,以及查看输出文件是什么?
  • 我使用 Windows XP 运行代码,使用记事本/写字板查看输出文件。当我使用写字板查看文件时,文件末尾只有一个空行。奇怪的是,当我使用记事本查看文件时,文件末尾有一个空行,然后在最后一行数据的末尾有一些未知的ASCII字符(一个矩形)。当我删除未知的 ASCII 字符时,空行也被删除。这让我觉得回车被无意中放在了文件的末尾。

标签: matlab file-io csv


【解决方案1】:

如果您未在 DLMWRITE 中指定“换行符”选项,MATLAB 使用 UNIX 样式的行尾字符(十六进制代码中的 LF、\x0A),即使在 Windows 机器上也是如此。但它确实会添加换行符。

如果你指定'newline','pc',它会放入DOS换行符(CRLF,十六进制\x0D0A)。

记事本只能理解 DOS 行尾。写字板两者都能理解。至少它在我的机器上是怎样的。

我建议您保持一致并为所有行使用相同的“换行符”选项。这样你也可以避免 for 循环。然后尝试在 MATLAB 编辑器中打开输出文件。

为什么你根本不想要行尾字符?如果这是您需要的,请使用FPRINTF 函数。但要做到这一点,您必须先使用 FOPEN 打开文件。为输出重写整个代码可能会更好。

类似这样的:

fid = fopen('textfile_updated.txt','w');
fprintf(fid,'%s\r\n',columnHeaders); %# \r\n for PC end-of-line
fprintf(fid,[repmat('%d,',1,size(importedData.data,2)-1) '%d\r\n'],importedData.data(1:end-1,:)');
fprintf(fid,[repmat('%d,',1,size(importedData.data,2)-1) '%d'],importedData.data(end,:));
fclose(fid);

【讨论】:

  • yuk,你就是那个男人!非常感谢您的帮助……您的回答很完美。
  • @Grant M.:谢谢。请不要忘记接受可以解决您问题的答案。
猜你喜欢
  • 2017-01-07
  • 2020-11-17
  • 2016-03-18
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多