【问题标题】:Read csv data to matlab读取csv数据到matlab
【发布时间】:2014-08-23 13:28:14
【问题描述】:

我在解析 csv 文件时遇到问题:

Date,Open,High,Low,Close,Volume,Adj Close
2014-08-22,16.08,16.19,15.80,16.00,139800,16.00
2014-08-21,16.16,16.33,16.00,16.10,128500,16.10
2014-08-20,16.00,16.28,15.78,16.15,271200,16.15
2014-08-19,16.20,16.27,15.96,16.04,379600,16.04
2014-08-18,16.87,16.87,16.10,16.16,259200,16.16
2014-08-15,16.54,16.55,16.21,16.38,190900,16.38

我当前的代码如下所示:

hist_data_f = fopen(hist_path)
fgets(hist_data_f);
hist_data = textscan(hist_data_f, '%s,%d,%d,%d,%d,%d,%d')

目前的结果是这样的:

hist_data =
{
  [1,1] =
  {
    [1,1] = 2014-08-22,16.08,16.19,15.80,16.00,139800,16.00
    [2,1] = 2014-08-21
    [3,1] = ,
    [4,1] = 16.20
    [5,1] = ,
    [6,1] = 16.55
    [7,1] = ,
    [8,1] = 16.41
    [9,1] = ,
    [10,1] = 16.53
    [11,1] = ,
    [12,1] = 327700,16.13
    [13,1] = 2014-08-05,17.00,17.29,16.91,17.01,125500,16.67
    [14,1] = 2014-08-04
    [15,1] = ,
    [16,1] = 17.86
    [17,1] = ,
    [18,1] = 18.80
    [19,1] = ,
    [20,1] = 18.96
    [21,1] = ,
    [22,1] = 19.10

...等等。

我的目标是拥有这样的数据:

hist_data = 
    [ 
      2014-08-22    16.08    16.19    15.80    16.00    139800    16.00
      2014-08-21    16.16    16.33    16.00    16.10    128500    16.10
      ...
    ]

我做过的其他尝试:

hist_data = textscan(hist_data_f, '%s,%d,%d,%d,%d,%d,%d','Delimiter',',')
hist_data = csvread('hist_data.csv')

我似乎无法获得所需的输出。 有什么建议吗?

我已通读 Reading CSV files with MATLAB? Reading .csv file into MATLAB 还有一些没有运气的人。

【问题讨论】:

  • 不应该把字符串项放在引号之间吗?
  • hist_data = [ 2014-08-22 16.08 ...] 是什么意思?你的意思是一个单元格数组(为了混合字符串和数字)?
  • 是的@LuisMendo,抱歉不太清楚

标签: matlab csv octave


【解决方案1】:

怎么样:数字部分是csv read

%reads the csv file from row 1 on, to avoid the headers, and string date
M = csvread('test.csv',1,1);

然后根据需要输出:

 M =

   1.0e+05 *

    0.0002    0.0002    0.0002    0.0002    1.3980    0.0002
    0.0002    0.0002    0.0002    0.0002    1.2850    0.0002
    0.0002    0.0002    0.0002    0.0002    2.7120    0.0002
    0.0002    0.0002    0.0002    0.0002    3.7960    0.0002
    0.0002    0.0002    0.0002    0.0002    2.5920    0.0002
    0.0002    0.0002    0.0002    0.0002    1.9090    0.0002

【讨论】:

  • 这是一个干净的解决方案。我最后也把它分开了,但略有不同。谢谢
【解决方案2】:

我不知道格式说明符中的, 是如何解释的。我想你正在寻找:

textscan(str,'%s%d%d%d%d%d','Delimiter',',')

【讨论】:

    【解决方案3】:

    Sebastien - 如果你想要的只是hist_data 中的字符串单元数组,那么为什么不像以前一样继续,而是将每一行都当作字符串来对待,而不是尝试确定哪些是字符串,哪些是数字?类似的东西

    hist_data_f = fopen(hist_path)
    fgets(hist_data_f);
    hist_data = textscan(hist_data_f, '%s\n');  % now every line is a string only
    

    hist_data 是一个元胞数组,因此现在只需将所有逗号替换为四个(或更多)空格

    hist_data = strrep(hist_data{1},',','    ');
    
    hist_data = 
        '2014-08-22    16.08    16.19    15.80    16.00    139800    16.00'
        '2014-08-21    16.16    16.33    16.00    16.10    128500    16.10'
        '2014-08-20    16.00    16.28    15.78    16.15    271200    16.15'
        '2014-08-19    16.20    16.27    15.96    16.04    379600    16.04'
        '2014-08-18    16.87    16.87    16.10    16.16    259200    16.16'
        '2014-08-15    16.54    16.55    16.21    16.38    190900    16.38'
    

    试试上面的方法,看看会发生什么!

    【讨论】:

      猜你喜欢
      • 2016-08-28
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      相关资源
      最近更新 更多