是否可以在Scilab 5.5.2中使用csvRead获得可变范围和列

时间:2016-06-07 22:22:46

标签: scilab

我是一个使用Scilab的相当新手,自学成才的程序员。我有我想读的.csv文件。它们是混合文本和数值,并且具有可变数量的列和行。我感兴趣的文件部分有固定数量的列但不包含行。我可以使用header参数跳过第一部分,但也可以在底部使用我不需要的单元格。它可能是什么样子的一个例子:

DATA,1,0,3,3960.4,3236,3373,-132
DATA,1,0,4,4544.5,3530,3588,-76
RANDOM TEXT,0
INFO,1,0,#+BHO0 _:WRF&-11,S%00-0-03-1       
INFO,2,1,#*BHO0 _8WRF&-11,NAS%00-0-15-1

我只对以DATA开头的行感兴趣。如果我尝试运行csvRead而不删除下面的行,我会收到此错误:

Warning: Inconsistency found in the columns. At line 4993, found 2 columns 
while the previous had 8.

我目前有一个程序可以读取文件并根据需要对其进行操作,但我必须进入每个文件并删除底行。有办法解决这个问题吗?

我当前的程序看起来像这样:

D = uigetfile([".csv"],"path", "Choose a file name", %t);
filename = fullfile(D);
sub = ["DATA" "0"];

//Import data
data = csvRead(filename, ',', [], 'string', sub, [], [], 34);
edit(filename)
//determine # of rows
data_size = size(data);
limit = data_size(1);

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

无法指定csvRead应忽略具有较少列的行,或使用默认集或任何内容(什么是好的)。 在您的情况下,可以采用解决方法,仅解析以DATA开头的行。这可以通过Regular Expressions完成。

csvReadregexpcomments参数可以忽略csv文件中与某个正则表达式匹配的行。在此旁边,还可以编写一个正则表达式,该表达式匹配匹配特定模式的所有字符串:

/^(?:(?!PATTERN).)*$/;    # Matches strings not containing PATTERN

在你的情况下应用这个正则表达式会导致包含PATTERN的所有行被假定为注释,因此将被忽略。

代码中的代码如下所示。

filename = fullfile('data.csv');
sub = ["DATA" "0"];

//Import data
number_of_header_lines = 1
read_only_lines_starting_with = 'DATA'
regexp_magic = '/^(?:(?!' + read_only_lines_starting_with + ').)*$/'

data = csvRead(filename, ',', [], 'string', sub, regexp_magic, [], number_of_header_lines);

disp(data)