将csv数据读取到matlab

时间:2014-08-23 13:28:14

标签: matlab csv octave

我在解析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 还有一些没有运气。

3 个答案:

答案 0 :(得分:2)

如何:数字部分的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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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'

尝试以上操作,看看会发生什么!