如何在内部更改十进制分隔符,同时从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包含所有数据。
我现在正在寻找一种方法,在原始数据中读取逗号作为小数分隔符,并将逗号转换为内部点,并将其保存为一个变量(结构体),我可以在脚本中的进一步检查中使用。
2的评论
丹尼斯·B
丹尼斯·B 2021年5月6日
你好,简,
谢谢你的提示,我会改的!你有没有其他的想法来改变内部的小数分隔符,而不必创建一个新的文件?

登录评论。

接受的答案

Stephen23
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
Stephen23 2022年10月20日
@Louis-Marie :假定代码中的OPTS变量是由DETECTIMPORTOPTIONS返回的对象,在这种情况下,您可以在那里指定'DecimalSeparator'选项。指定。没有意义 “DecimalSeparator” 选项,因为DETECTIMPORTOPTIONS还需要知道小数分隔符来检测例如哪些数据是数字。

登录评论。

更多答案(0)

s manbetx 845


释放

R2019b

社区寻宝

在MATLAB Central中寻找宝藏,并了解社区如何帮助您!

开始狩猎!