我是一个使用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);
有什么想法吗?
答案 0 :(得分:0)
无法指定csvRead
应忽略具有较少列的行,或使用默认集或任何内容(什么是好的)。
在您的情况下,可以采用解决方法,仅解析以DATA
开头的行。这可以通过Regular Expressions完成。
csvRead
的regexpcomments
参数可以忽略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)