将csv数据读取到matlab

将csv数据读取到matlab,matlab,csv,octave,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

我在解析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')
我似乎不能得到想要的输出。 有什么建议吗

我通读了 还有一些人运气不好。

那数字部分呢

%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

Sebastien-如果您想要的只是
历史数据中的字符串单元格数组
,那么为什么不像以前一样继续,而只是将每一行视为字符串,而不是试图确定哪些是字符串,哪些是数字?差不多

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
是一个单元格数组,因此现在只需将所有逗号替换为四个(或更多)空格即可


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

我不知道格式说明符中的
是如何解释的。我认为您正在寻找:


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

您不应该将字符串项放在引号之间吗?您所说的
hist_data=[2014-08-22 16.08…]是什么意思?你是说一个单元格数组(为了混合字符串和数字)?是的@LuisMendo,很抱歉它不太清晰这是一个干净的解决方案。我最后也把它分开了,但有点不同。非常感谢。
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'