- 不要使用重要的函数“path”作为变量名。这可能会在调试期间导致非常奇怪的效果。
- 避免使用cd()来更改当前目录。gui或计时器的回调也可以这样做,并且假设文件不再被找到。这是一个常见的bug来源。使用绝对路径名,而不是使用fullfile(文件夹,文件名).
- :
如何在内部更改十进制分隔符,同时从csv导入数据?
353次浏览(最近30天)
显示旧的注释
你好,
我目前正在处理非常大的数据文件(csv),大约有15000行和几百列。由于单元格中的数据是由欧洲软件派生的,因此小数分隔符是一个逗号,我使用一个小脚本将其替换为一个点。这个脚本工作得很好,但由于不能操纵原始文件,因此必须将更正的数据存储在新文件中。我想做的是从文件中导入数据,生成一个包含所有数据的工作空间变量,但是逗号被点代替。这将是非常有用的,因为要进一步处理数据,我总是必须生成一个新文件并手动加载。由于这相当耗时,我想避免这一步。
目前的流程:
%%小脚本,用点替换逗号,并将更正后的数据保存到名为[…]_dots的新csv文件中
(文件名、路径)= uigetfile (‘* . csv‘);
cd(路径);
disp(文件名)
oldfile =文件名(1:end-4);
NewFileName = sprintf(“% s_Dots.csv”, oldfile);
Data = fileread(文件名);
数据= strrep(数据,”、“,“。”);
%将更正后的数据保存到新文件
FID = fopen(NewFileName;' w ');
写入文件(支撑材、数据“字符”);
文件关闭(FID);
当使用点作为小数分隔符时,导入非常容易,并生成一个方便的结构数组,用于数据的进一步求值,如下所示。结构数组用于进一步检查数据
i_start_import = 1;
datastruct = importdata(文件名,“;”, i_start_import);
但是,当逗号用作小数分隔符时,importdata函数不会生成结构数组。
实验:
到目前为止,我尝试接收相同的结构,但以点作为分隔符是在原始数据中读取importdata,以进一步将逗号转换为点,然后分割数据字符串以接收表格存储的数据。不幸的是,这非常耗时,对于我的csv中的所有数千个单元格(特别是拆分过程)来说,这花费的时间太长。
应用importdata后的数据如下所示:
然后被分割成这样:
data = importdata(文件名,“;”, 100000);
%创建结构数组
datastruct =结构
datastruct.data = [];
%用点代替逗号
为i = 1:长度(数据)
{我}= strrep(数据,”、“,“。”);
{我}=数据;
结束
%拆分数据字符串
为i = 1:长度(数据)%索引行
为j = 1:516%因为有516列,索引列
{我}str = strsplit(数据,“;”);
datastruct.textdata {i, j} = str (j);
如果j = = 516
打破
其他的
继续
结束
结束
结束
理想情况下,数据应该存储在一个结构数组中,字段textdata包含第一列(TimeStamp)和第一行(变量)的值,字段data包含所有数据。
我现在正在寻找一种方法,在原始数据中读取逗号作为小数分隔符,并将逗号转换为内部点,并将其保存为一个变量(结构体),我可以在脚本中的进一步检查中使用。
接受的答案
Stephen23
2021年5月6日
编辑:Stephen23
2021年5月6日
不要使用CD访问数据文件:使用绝对/相对文件名(使用FULLFILE)更有效。
要导入CSV文件(实际上您似乎有一个分号分隔的字段),只需选择适当的READTABLE或READMATRIX选项:
[F,P] = uigetfile()‘* . csv‘);
T = readtable(fullfile(P,F),“分隔符”,“;”,“DecimalSeparator”,”、“,“VariableNamingRule”,“保存”)
根据你的档案进行调整。如果您已经上传了一个实际的数据文件(而不是屏幕截图)
回形针
按钮,那么我也会测试这个。
17日评论
Stephen23
2022年10月20日
@Louis-Marie
:假定代码中的OPTS变量是由DETECTIMPORTOPTIONS返回的对象,在这种情况下,您可以在那里指定'DecimalSeparator'选项。指定。没有意义
“DecimalSeparator”
选项,因为DETECTIMPORTOPTIONS还需要知道小数分隔符来检测例如哪些数据是数字。