如何在MATLAB R2016b(mac版)中处理带字符串的CSV文件
How to deal with a CSV file with strings in MATLAB R2016b (mac version)
我现在正尝试在 matlab r2016b mac 版本中处理大型 csv(200 万行)。下面附上csv的一小部分。
user_id,video_id,session,new_speed,old_speed,new_time,old_time,event_type,event_time
a74fe6d4812fa93a1afa1a6a334ebdda,af7f974d395a4adddc8ab17a83996073,892d85cfeea8298fb7ca8755ac090e90,,,,,play_video,2015-04-06 22:20:58.928268
a74fe6d4812fa93a1afa1a6a334ebdda,af7f974d395a4adddc8ab17a83996073,892d85cfeea8298fb7ca8755ac090e90,,,161.0,72.581,seek_video,2015-04-06 22:20:58.879149
a74fe6d4812fa93a1afa1a6a334ebdda,7fb29805973a8a396c6de3faa8290ac1,892d85cfeea8298fb7ca8755ac090e90,,,,,play_video,2015-04-06 22:24:14.988693
a74fe6d4812fa93a1afa1a6a334ebdda,9ace07b312f206ef7af2f48188360b16,892d85cfeea8298fb7ca8755ac090e90,,,,,load_video,
我想做的是
- 将csv文件读入matlab;
- 将用户id和视频id映射成简单的数字id;
- 删除会话 ID。
我试了很多方法都得不到我想要的结果。 csvread
无法处理这个 csv 文件,因为里面有一些非数字项,而我不熟悉 fopen
并且总是会出现一些奇怪的错误,比如所有数据都进入一个单元格。这个问题有什么解决办法吗?
我无法想象你要用那个字符串数组做什么。如果你只需要编辑文件,我建议使用 python (这是最简单但不是最快的,虽然比 matlab 快)或 C(考虑到您有 200 万行的情况,这要快得多,但不是最简单的)。
据我所见,Matlab 非常擅长矩阵的数学运算,但对于您想要执行的操作而言,这不是一个好的选择。也许如果您说出您将如何处理所有这些数据(我的意思是根据您所说的进行数学运算),有人可以提供帮助!
由于您提到的文本格式不同,因此最好使用 textread()
函数。它 returns 1D 元胞数组。所以首先你必须通过 regexp()
解析它并以这种方式索引单元格:
Thecell{row}{column} %accessing cell elements
开始吧:
cellarray = textread('Put directory here','%s',9);
for i=1:length(cellarray)
parsed_cell{i} = regexp(cellarray, ',', 'split'); %% Parsing 1d cell
end
%% 3 items which you wanted for e.g. the first line
line1 = parsed_cell{1};
line1{1}{3} = []; %% Deleting session id in line 1 of the text.
%%easily can be implemented for others
%% putting user_id,video_id into number id in line 1.
numberid = [line1{1}{1},line1{1}{2}];
我现在正尝试在 matlab r2016b mac 版本中处理大型 csv(200 万行)。下面附上csv的一小部分。
user_id,video_id,session,new_speed,old_speed,new_time,old_time,event_type,event_time
a74fe6d4812fa93a1afa1a6a334ebdda,af7f974d395a4adddc8ab17a83996073,892d85cfeea8298fb7ca8755ac090e90,,,,,play_video,2015-04-06 22:20:58.928268
a74fe6d4812fa93a1afa1a6a334ebdda,af7f974d395a4adddc8ab17a83996073,892d85cfeea8298fb7ca8755ac090e90,,,161.0,72.581,seek_video,2015-04-06 22:20:58.879149
a74fe6d4812fa93a1afa1a6a334ebdda,7fb29805973a8a396c6de3faa8290ac1,892d85cfeea8298fb7ca8755ac090e90,,,,,play_video,2015-04-06 22:24:14.988693
a74fe6d4812fa93a1afa1a6a334ebdda,9ace07b312f206ef7af2f48188360b16,892d85cfeea8298fb7ca8755ac090e90,,,,,load_video,
我想做的是
- 将csv文件读入matlab;
- 将用户id和视频id映射成简单的数字id;
- 删除会话 ID。
我试了很多方法都得不到我想要的结果。 csvread
无法处理这个 csv 文件,因为里面有一些非数字项,而我不熟悉 fopen
并且总是会出现一些奇怪的错误,比如所有数据都进入一个单元格。这个问题有什么解决办法吗?
我无法想象你要用那个字符串数组做什么。如果你只需要编辑文件,我建议使用 python (这是最简单但不是最快的,虽然比 matlab 快)或 C(考虑到您有 200 万行的情况,这要快得多,但不是最简单的)。
据我所见,Matlab 非常擅长矩阵的数学运算,但对于您想要执行的操作而言,这不是一个好的选择。也许如果您说出您将如何处理所有这些数据(我的意思是根据您所说的进行数学运算),有人可以提供帮助!
由于您提到的文本格式不同,因此最好使用 textread()
函数。它 returns 1D 元胞数组。所以首先你必须通过 regexp()
解析它并以这种方式索引单元格:
Thecell{row}{column} %accessing cell elements
开始吧:
cellarray = textread('Put directory here','%s',9);
for i=1:length(cellarray)
parsed_cell{i} = regexp(cellarray, ',', 'split'); %% Parsing 1d cell
end
%% 3 items which you wanted for e.g. the first line
line1 = parsed_cell{1};
line1{1}{3} = []; %% Deleting session id in line 1 of the text.
%%easily can be implemented for others
%% putting user_id,video_id into number id in line 1.
numberid = [line1{1}{1},line1{1}{2}];