读取包含逗号的字符串作为一个字段的大型csv文件

3

我有一个非常大的.csv文件(约26000行),想要将其读入Matlab。另一个问题是它包含了一个字段中用逗号分隔的字符串集合。

我无法成功读取它。我尝试了tdfread等方法,但不起作用。你知道textscan的一些技巧吗?

还有其他方法吗?


1
你能否发布至少一行数据? - Amro
我原以为Matlab可以本地读取CSV文件。默认情况下,load命令不起作用吗? 我记得以前看到有人装载过一个CSV文件。 - Chris H
如果您可以访问导出数据的应用程序,您可能可以将其导出为制表符分隔的格式(或其他逗号分隔以外的格式)。 - user113476
是的,一些数据会很有用。特别是那个带逗号的字段。它是在双引号中吗? @Chris:Matlab有CSVREAD函数,但它只能读取数值。当它发现文本数据时,它会停止。您可以指定数字列的范围,在这种情况下,字符串将被忽略。 - yuk
1 563355 62701 0 1235000081 php,error,gd,image-processing 220 2 563372 67183 2 1235000501这是一行数据。正如您所注意到的那样,其中有一组字符串。谢谢。 - K_U
6个回答

2
我不确定生成你的CSV文件的程序是什么,但这是你的问题。
CSV文件的目的在于文件本身指定了字段之间的分隔符。如果CSV文本包含逗号,则无论你做什么都无法解决问题。任何程序怎样才能知道单个字段中的文本是否包含逗号,或该逗号是否为字段分隔符呢?
正确的CSV应该有一个文本限定符。一些生成器/阅读器会给你使用它的选项。标准的文本限定符是双引号(")。它是可以更改的,因为你的文本可能也包含这些字符。
总之,这取决于生成正确的CSV内容。

CSV文件是提供给我的,我无法控制它的生成方式。不过这也没关系。据我所知,可以设计一个基于上下文的词法分析器来遍历文件,并将逗号(用于分隔一组字符串)更改为其他字符。 - K_U
当字段中有逗号而没有文本限定符时,您无法区分文本中的字段分隔符和逗号。您能否与生成此CSV文件的人交谈并让他们使用文本限定符? - Gabriel McAdams

1

xlsread有可能不会给你期望的答案——例如,字符串总是出现在相同的列中吗?我认为(似乎所有人都这么认为),更健壮的方法是直接使用

fid = fopen('yourfile.csv');

然后使用textscan函数

t = textscan(fid, '%s', delimiter', sprintf('\n'));
t = t{1};

或者只是使用fgetl(帮助中的示例非常完美)。

之后,您可以进行一些逐行处理--例如,在每行的文本内容上再次使用textscan是一种不错的快速方法,可以获得一个单元数组,从而可以快速分析每行。


+1 我发现当你的数据不仅仅是规范的数字时,MATLAB的“自动加载”功能并不是非常健壮。我甚至遇到过一些问题,比如加载十六进制数的错误未记录特性。虽然很糟糕,但如果有疑问,最好自己实现解析。 - Kena

0
一个简单的解决方案是:
path='C:\folder1\folder2\';
data = 'data.csv';
data = dataset('xlsfile',sprintf('%s\%s', path,data));

当然,你也可以这样做:

[data,path] = uigetfile('C:\folder1\folder2\*.csv');
data = dataset('xlsfile',sprintf('%s\%s', path,data));

现在你已经将数据加载为数据集。例如获取第一列的简单方法是

double(data(1))


0

你遇到了一个问题,因为你将它读入为 .csv 文件,并且你的数据中有逗号。你可以在 Excel 中获取它并操作日期,可能使用 Excel 公式提取不需要的逗号。我经常使用 .csv 文件进行数据库导入。我想 matLab 也有类似的规则,即 - 数据中不能有逗号。

你能告诉我们更多关于你的数据吗?是否整个数据中都有逗号,还是只有一个列?也许你可以将其读入为制表符分隔的文件?


2
这对于Excel来说没有帮助,因为它会将所有行视为逗号分隔的值,并且实际上会产生额外的列。 - DoctorLouie
实际上,如果您将其保存为 .xls 格式,则可以在单元格内包含逗号。此时,您可以运行函数以提取逗号,然后另存为 .csv 格式。 - tpow
我尝试将其转换为xls格式,但行数远超过最大限制。实际上是 ~263000。我认为xls的最大限制是65535乘以 ~277左右。我设法使用csv文件本身上的xlsread读取它。谢谢。 - K_U
Excel中字段只能使用逗号,因为它们为该字段设置了文本限定符(")。如果没有文本限定符,即使是Excel也无法确定它应该是包含逗号的单个字段(附注:Excel 2007允许超过一百万行)。 - Gabriel McAdams

0

正如其他人所观察到的那样,您的文件是带有逗号的CSV文件,而逗号在您认为是单个字段的内部,这将很难让Matlab相信那确实只是一个字段。我认为您最好的策略是逐行读取,进入充当缓冲区的字符串,并将其逐个字段地转换为您想要的变量或其他数据结构。由于Matlab具有内置的正则表达式功能,因此这不应该太难。

另外,正如其他人已经建议的那样,发布一份数据样本将有助于我们帮助您。


我成功地使用Matlab中的xlsread函数读取了文件。我使用了一个选项,可以让函数将数值、文本和原始数据分别存储在不同的矩阵中。 - K_U

0
你使用的是Unix系统吗?我问这个问题是因为你可以使用命令行函数,例如sed和正则表达式,在将数据文件传递到Matlab之前清理这些文件。这里有一个link,它解释了如何做到你所需要的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接