如何解析包含 CSV 数据集的字符串变量?
How to parse a string variable that contains a CSV dataset?
我看到有关如何读取 CSV 文件的参考资料,例如:
X = csvread('gs_train.csv');
但是,当 CSV 数据在变量中时,我找不到任何参考。
具体来说,我有:
output = 1546405200000,38.7225,39.7125,38.5575,39.48,148158948
1546491600000,35.995,36.43,35.5,35.5475,365248780
1546578000000,36.1325,37.1375,35.95,37.065,234284280
1546837200000,37.175,37.2075,36.475,36.9825,219111056
1546923600000,37.39,37.955,37.13,37.6875,164101256
1547010000000,37.8225,38.6325,37.4075,38.3275,180396324
1547096400000,38.125,38.4925,37.715,38.45,143122680
1547182800000,38.22,38.425,37.8775,38.0725,108082828
1547442000000,37.7125,37.8175,37.305,37.5,129756744
1547528400000,37.5675,38.3475,37.5125,38.2675,114841296
1547614800000,38.27,38.97,38.25,38.735,122278824
1547701200000,38.55,39.415,38.315,38.965,119284640
1547787600000,39.375,39.47,38.9952,39.205,135004092
1548133200000,39.1025,39.1825,38.155,38.325,121575880
1548219600000,38.5375,38.785,37.925,38.48,92522280
1548306000000,38.5275,38.62,37.935,38.175,101766196
1548392400000,38.87,39.5325,38.58,39.44,133635572
1548651600000,38.9475,39.0825,38.415,39.075,104768232
1548738000000,39.0625,39.5325,38.5275,38.67,166348956
1548824400000,40.8125,41.5375,40.0575,41.3125,244337120
1548910800000,41.5275,42.25,41.14,41.61,162958596
最后我想
A =
1546405200000 38.7225 39.7125 38.5575 39.48 148158948
1546491600000 35.995 36.43 35.5 35.5475 365248780
1546578000000 36.1325 37.1375 35.95 37.065 234284280
1546837200000 37.175 37.2075 36.475 36.9825 219111056
1546923600000 37.39 37.955 37.13 37.6875 164101256
1547010000000 37.8225 38.6325 37.4075 38.3275 180396324
1547096400000 38.125 38.4925 37.715 38.45 143122680
1547182800000 38.22 38.425 37.8775 38.0725 108082828
1547442000000 37.7125 37.8175 37.305 37.5 129756744
1547528400000 37.5675 38.3475 37.5125 38.2675 114841296
1547614800000 38.27 38.97 38.25 38.735 122278824
1547701200000 38.55 39.415 38.315 38.965 119284640
1547787600000 39.375 39.47 38.9952 39.205 135004092
1548133200000 39.1025 39.1825 38.155 38.325 121575880
1548219600000 38.5375 38.785 37.925 38.48 92522280
1548306000000 38.5275 38.62 37.935 38.175 101766196
1548392400000 38.87 39.5325 38.58 39.44 133635572
1548651600000 38.9475 39.0825 38.415 39.075 104768232
1548738000000 39.0625 39.5325 38.5275 38.67 166348956
1548824400000 40.8125 41.5375 40.0575 41.3125 244337120
我不确定 Matlab 和 Octave 是否有相同的解决方案来处理这种情况。
我在 Matlab 文档页面上搜索了对字符串进行操作的函数,并找到了“替换”函数。这似乎可以满足您的需求。
你的情况是:
A = replace(X, ",", " ");
像大多数 Matlab input/output 函数一样,没有选项可以让 csvread
或 read*
从变量或其他 in-memory 数据源读取它。你必须将它反弹到一个临时文件并阅读它。
Matlab 标准库中的一个缺点,如果你问我的话。
如果您绝望这样做in-memory,您可以求助于使用支持读取 InputStreams 的 Java CSV 解析库:获取字符串的原始字节,将其包装在 Java ByteArrayInputStream 中,并从中解析。为了使其有效地工作,您可能需要编写一些自定义 Java 代码,这样结果就可以作为数组有效地传回,而不需要多次调用 Java 方法来获取。 Java 来自 M-code 的方法调用很慢。
或者制作一个 RAMdisk 并将其用于您的临时文件,如果您急需速度。
是的,Octave 也是如此。
在 Octave 中,我可以使用 str2num
将逗号分隔的字符串转换为矩阵:
A = str2num (output);
除了 rahnema1 的 one-liner 之外,您还可以使用 textscan 执行此操作,但您需要手动提供需要解析的列数。 textscan 的输出是单元格形式,所以如果你的 csv 是严格的数字,你可以将它转换成数字矩阵:
cell2mat( textscan( output, "%f,%f,%f,%f,%f,%f" ) )
但是,如果您的 csv 文件还包含要捕获的 non-numeric 字段,textscan 方法可能会有用,在这种情况下,您可以将输出保留为单元格。
我看到有关如何读取 CSV 文件的参考资料,例如:
X = csvread('gs_train.csv');
但是,当 CSV 数据在变量中时,我找不到任何参考。
具体来说,我有:
output = 1546405200000,38.7225,39.7125,38.5575,39.48,148158948
1546491600000,35.995,36.43,35.5,35.5475,365248780
1546578000000,36.1325,37.1375,35.95,37.065,234284280
1546837200000,37.175,37.2075,36.475,36.9825,219111056
1546923600000,37.39,37.955,37.13,37.6875,164101256
1547010000000,37.8225,38.6325,37.4075,38.3275,180396324
1547096400000,38.125,38.4925,37.715,38.45,143122680
1547182800000,38.22,38.425,37.8775,38.0725,108082828
1547442000000,37.7125,37.8175,37.305,37.5,129756744
1547528400000,37.5675,38.3475,37.5125,38.2675,114841296
1547614800000,38.27,38.97,38.25,38.735,122278824
1547701200000,38.55,39.415,38.315,38.965,119284640
1547787600000,39.375,39.47,38.9952,39.205,135004092
1548133200000,39.1025,39.1825,38.155,38.325,121575880
1548219600000,38.5375,38.785,37.925,38.48,92522280
1548306000000,38.5275,38.62,37.935,38.175,101766196
1548392400000,38.87,39.5325,38.58,39.44,133635572
1548651600000,38.9475,39.0825,38.415,39.075,104768232
1548738000000,39.0625,39.5325,38.5275,38.67,166348956
1548824400000,40.8125,41.5375,40.0575,41.3125,244337120
1548910800000,41.5275,42.25,41.14,41.61,162958596
最后我想
A =
1546405200000 38.7225 39.7125 38.5575 39.48 148158948
1546491600000 35.995 36.43 35.5 35.5475 365248780
1546578000000 36.1325 37.1375 35.95 37.065 234284280
1546837200000 37.175 37.2075 36.475 36.9825 219111056
1546923600000 37.39 37.955 37.13 37.6875 164101256
1547010000000 37.8225 38.6325 37.4075 38.3275 180396324
1547096400000 38.125 38.4925 37.715 38.45 143122680
1547182800000 38.22 38.425 37.8775 38.0725 108082828
1547442000000 37.7125 37.8175 37.305 37.5 129756744
1547528400000 37.5675 38.3475 37.5125 38.2675 114841296
1547614800000 38.27 38.97 38.25 38.735 122278824
1547701200000 38.55 39.415 38.315 38.965 119284640
1547787600000 39.375 39.47 38.9952 39.205 135004092
1548133200000 39.1025 39.1825 38.155 38.325 121575880
1548219600000 38.5375 38.785 37.925 38.48 92522280
1548306000000 38.5275 38.62 37.935 38.175 101766196
1548392400000 38.87 39.5325 38.58 39.44 133635572
1548651600000 38.9475 39.0825 38.415 39.075 104768232
1548738000000 39.0625 39.5325 38.5275 38.67 166348956
1548824400000 40.8125 41.5375 40.0575 41.3125 244337120
我不确定 Matlab 和 Octave 是否有相同的解决方案来处理这种情况。
我在 Matlab 文档页面上搜索了对字符串进行操作的函数,并找到了“替换”函数。这似乎可以满足您的需求。
你的情况是:
A = replace(X, ",", " ");
像大多数 Matlab input/output 函数一样,没有选项可以让 csvread
或 read*
从变量或其他 in-memory 数据源读取它。你必须将它反弹到一个临时文件并阅读它。
Matlab 标准库中的一个缺点,如果你问我的话。
如果您绝望这样做in-memory,您可以求助于使用支持读取 InputStreams 的 Java CSV 解析库:获取字符串的原始字节,将其包装在 Java ByteArrayInputStream 中,并从中解析。为了使其有效地工作,您可能需要编写一些自定义 Java 代码,这样结果就可以作为数组有效地传回,而不需要多次调用 Java 方法来获取。 Java 来自 M-code 的方法调用很慢。
或者制作一个 RAMdisk 并将其用于您的临时文件,如果您急需速度。
是的,Octave 也是如此。
在 Octave 中,我可以使用 str2num
将逗号分隔的字符串转换为矩阵:
A = str2num (output);
除了 rahnema1 的 one-liner 之外,您还可以使用 textscan 执行此操作,但您需要手动提供需要解析的列数。 textscan 的输出是单元格形式,所以如果你的 csv 是严格的数字,你可以将它转换成数字矩阵:
cell2mat( textscan( output, "%f,%f,%f,%f,%f,%f" ) )
但是,如果您的 csv 文件还包含要捕获的 non-numeric 字段,textscan 方法可能会有用,在这种情况下,您可以将输出保留为单元格。