【问题标题】:Reading large csv files with strings containing commas as one field读取包含逗号作为一个字段的字符串的大型 csv 文件
【发布时间】:2011-01-11 07:52:26
【问题描述】:

我有一个 .csv 文件(约 26000 行)。我希望能够将它读入matlab。另一个问题是它在一个字段中包含一组用逗号分隔的字符串

我无法阅读它。我尝试了 tdfread 之类的东西,但在这里不起作用。我应该注意任何关于 textscan 的技巧?

还有其他方法吗?

【问题讨论】:

  • 你能发布至少一行数据吗..
  • 我认为 matlab 可以原生读取 cvs。 load 命令默认不起作用?我可以发誓我以前看到有人加载过简历。
  • 如果您有权访问导出数据的应用程序,则可以将其导出为制表符分隔(或逗号分隔以外的其他内容)。
  • 是的,有些数据会很有用。特别是带有逗号的那个字段。是双引号吗? @Chris:Matlab 有 CSVREAD 功能,但它只能读取数值。它会在找到文本数据时停止。您可以指定数字列的范围,在这种情况下,字符串将被忽略。
  • 1 563355 62701 0 1235000081 php,error,gd,image-processing 220 2 563372 67183 2 1235000501 那是一行数据。如您所见,有一个字符串集合。谢谢。

标签: matlab file-io csv large-files


【解决方案1】:

我不确定是什么生成了您的 CSV 文件,但这是您的问题。

CSV 文件的意义在于文件本身指定了字段的分隔。如果 CSV 的文本包含逗号,那么您无能为力。任何程序如何知道单个字段中的文本何时包含逗号,或者该逗号何时是字段分隔符?

正确的 CSV 会有一个文本限定符。一些生成器/阅读器让您可以选择使用其中一个。标准文本限定符是 "(引号)。不过,它是可变的,因为您的文本也可能包含这些。

同样,这一切都是为了生成正确的 CSV 内容。

【讨论】:

  • CSV 文件是提供给我的,我无法控制它是如何生成的。好点子。我听说可以设计一个基于上下文的词法分析器来运行文件并将逗号(分隔字符串集合)更改为另一个字符。
  • 当字段中有逗号且没有文本限定符时,您无法区分字段分隔符和文本中的逗号。您能否与生成此 CSV 并让他们使用文本限定符的人交谈?
【解决方案2】:

xlsread 有可能无法给出您期望的答案——例如,字符串是否总是出现在相同的列中?我认为(正如其他人似乎 :-) 只使用

会更健壮
fid = fopen('yourfile.csv');

然后是 textscan

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

或者只是fgetl(帮助中的例子很完美)。

之后,您可以进行一些逐行处理——例如,对每一行的文本内容再次使用 textscan,这是一种快速、快速的方法来获得一个单元数组,可以快速分析每个行。

【讨论】:

  • +1 我发现当您的数据不仅仅是表现良好的数字时,MATLAB“自动加载”功能并不是非常强大。我什至遇到了错误的未记录功能(加载十六进制数字)的问题。这很糟糕,但如果有疑问,最好自己实现解析。
【解决方案3】:

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

您能告诉我们更多有关您的数据的信息吗?是否有逗号,我们只有一列?也许您可以将其读取为制表符分隔?

【讨论】:

  • 这不会帮助 excel 将所有行视为逗号分隔值,并且本质上会产生额外的列。
  • 实际上,如果您将其放在 .xls 中,则您的单元格中可以使用逗号。此时,您可以运行函数来提取逗号,然后另存为 .csv
  • 我尝试转换成xls,但是行数远远超过了最大限制。它实际上是〜263000。我认为 xls 的最大限制为 65535 x 277 或其他东西。我设法在 csv 文件本身上使用 xlsread 读取它。谢谢
  • Excel 只能在字段中使用逗号,因为他们正在为该字段设置文本限定符 (")。没有一个,即使 Excel 也无法确定它应该是包含逗号 (旁注:Excel 2007 允许超过一百万行)
【解决方案4】:

您使用的是 Unix 系统吗?我问的原因是您可以在将这些数据文件传递到 Matlab 之前使用诸如sed 和正则表达式之类的命令行函数来清理这些数据文件。这是一个link,它解释了如何做你正在寻找的东西。

【讨论】:

    【解决方案5】:

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

    而且,正如其他人已经建议的那样,发布您的数据样本将有助于我们为您提供帮助。

    【讨论】:

    • 我设法在 matlab 中使用 xlsread 读取文件。我使用了可以获取函数的选项,以在不同的矩阵中为我提供数字、文本和原始数据。
    【解决方案6】:

    一个简单的解决方案是:

    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));
    

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

    双(数据(1))

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 2013-07-29
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多