【问题标题】:How to deal with a CSV file with strings in MATLAB R2016b (mac version)如何在 MATLAB R2016b(mac 版)中处理带字符串的 CSV 文件
【发布时间】:2017-11-25 11:53:26
【问题描述】:

我现在正在尝试处理 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,

我想做的是

  1. 将csv文件读入matlab;
  2. 将用户id和视频id映射成简单的数字id;
  3. 删除会话 ID。

我尝试了很多方法,但都没有得到我想要的结果。 csvread 无法处理这个 csv 文件,因为里面有一些非数字项目,而我不熟悉 fopen 并且总是会遇到一些奇怪的错误,比如所有数据都进入一个单元格。这个问题有解决办法吗?

【问题讨论】:

  • 我的回答解决了你的问题吗?
  • @Poyuan.Bn 抱歉,我现在才查看。它有效,非常感谢!

标签: matlab csv fopen


【解决方案1】:

我无法想象你会用这个字符串数组做什么。如果您只需要编辑文件,我建议使用 python (最简单但不是最快的,虽然比 matlab 快)或 C (快得多鉴于您的条件为 200 万行,但不是最简单的)。

据我从 Matlab 看到的,它非常擅长对矩阵进行数学运算,但对于您想做的事情来说不是一个好的选择。也许如果你说你将如何处理所有这些数据(我的意思是在你所说的之后进行数学运算),有人可以提供帮助!

【讨论】:

  • 感谢您的评论!我也在纠结是否也应该转向 python。但是由于我之前没有使用过python,请您给我一些提示,我可以使用哪些函数来处理这个问题?
  • 有一个很好的处理 csv 文件的库:docs.python.org/3/library/csv.html 你可以在文档中看到一些例子
  • 非常感谢您的帮助!
【解决方案2】:

由于您提到的文本格式不同,因此最好使用textread() 函数。它返回 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}]; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2014-08-10
    • 2013-11-27
    • 2010-09-05
    • 1970-01-01
    • 2023-03-24
    • 2018-01-01
    相关资源
    最近更新 更多