Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用TextScan在Matlab中一次导入所有值_Matlab_Csv_Import_Textscan - Fatal编程技术网

无法使用TextScan在Matlab中一次导入所有值

无法使用TextScan在Matlab中一次导入所有值,matlab,csv,import,textscan,Matlab,Csv,Import,Textscan,我有一个1911518个值的数据集。我使用了文本扫描功能。但该函数只返回1424458个值。我再次创建了一个新变量来获取剩余的值,但这次它给了我大约9000个值。有人知道这是什么原因吗 n=9 N=1911518 file_id=fopen('CRSP.csv'); C=textscan(file_id,'%s',n,'delimiter', ','); %To get the headers C_text=textscan(file_id,'%s %s %s %d %d %d %d %f

我有一个1911518个值的数据集。我使用了文本扫描功能。但该函数只返回1424458个值。我再次创建了一个新变量来获取剩余的值,但这次它给了我大约9000个值。有人知道这是什么原因吗

n=9
N=1911518

file_id=fopen('CRSP.csv');

C=textscan(file_id,'%s',n,'delimiter', ','); %To get the headers
C_text=textscan(file_id,'%s %s %s %d %d %d %d %f %f',N, 'delimiter' , ','); 

%Returns 1424458

C_text1=textscan(file_id,'%s %s %s %d %d %d %d %f %f',N, 'delimiter' , ','); 

%Returns only 9000 values    

fclose(file_id);
样本数据

DATE,COMNAM,TICKER,PERMNO,PERMCO,SHROUT,VOL,RET,sprtrn

01/02/1996, ACME CLEVELAND CORP NEW, AMT, 10057, 20020, 6313, 23700,  0.000000,  0.007793
01/03/1996, ACME CLEVELAND CORP NEW, AMT, 10057, 20020, 6313, 20800,  0.020000,  0.000950
01/04/1996, ACME CLEVELAND CORP NEW, AMT, 10057, 20020, 6313, 65300, -0.026144, -0.005826
01/05/1996, ACME CLEVELAND CORP NEW, AMT, 10057, 20020, 6313, 340600, 0.000000, -0.001587
01/08/1996, ACME CLEVELAND CORP NEW, AMT, 10057, 20020, 6313, 3400,   0.000000,  0.002821
01/09/1996, ACME CLEVELAND CORP NEW, AMT, 10057, 20020, 6313, 27200, -0.006711, -0.014568
01/10/1996, ACME CLEVELAND CORP NEW, AMT, 10057, 20020, 6313, 25400, -0.033784, -0.018000
01/11/1996, ACME CLEVELAND CORP NEW, AMT, 10057, 20020, 6313, 14000,  0.000000,  0.007034

我会假设数据中有一些错误,或者格式模式与数据不匹配。尝试提取以下行:

file_id=fopen('CRSP.csv');
for idx=1:1424456
    fgetl(file_id); %dump data
end
for idx=1:10
    fprintf('%s\n',fgetl(file_id));
end
如果有错误,则应位于第2或第3打印行。有什么特别的吗?也许是一个有特殊性格的
com

要读取该文件,我将使用以下代码逐行读取:

file_id=fopen('CRSP.csv');
line=fgetl(file_id);
data={};
int ix=1;
while(ischar(line))
    [parsed,sindex,eindex] = regexpi(line,'(\d\d/\d\d/\d\d\d\d)\s*, ([\w ]+), ([\w ]+), ([\d]+), ([\d]+), ([\d]+), ([\d]+), ([\d \.]+), ([\d \.]+)','tokens')
    if ~isempty(sindex)&&numel(sindex)==1&&(sindex==1)&&(eindex==numel(x))
        data{end+1}=parsed{1};
    else
        fprintf('Unable to parse line %d with content: %S',ix,line);
    end
    line=fgetl(file_id);
    ix=ix+1;
end
正则表达式的简短摘要:

“(…)”之间的所有内容都是返回的“令牌”

“([\d.]+)”数字、空格和“”

“([\d.]+)”数字和空白

“([\w]+)”字,包括空格

“(\d\d/\d\d/\d\d\d\d)”日期


这个表达有点“懒惰”。它不仅接受“0.000”作为一个数字,还接受“0.00.”或其他一些组合,但它应该足以检测所有错误。如果没有,表达式必须改进。

丹尼尔R的答案基本上是正确的。详细说明一下(我会将此作为评论发布,但我缺乏声誉),
textscan
在MATLAB中非常挑剔,只要遇到与您指定的格式不完全匹配的内容,它基本上就会退出

如果您有一个数据文件可能包含一些错误或不一致,那么您的主要选择是以某种方式预处理该文件以删除这些错误,或者(正如Daniel所建议的)自己逐行读取该文件,并按照您的意愿对其进行解析。前者的工作量可能与后者相当,除非您计划手动执行,并且没有太多错误需要修复,因此在大多数情况下,编写自己的解析器可能更容易


你唯一可能做的另一件事是——如果唯一的错误是类型错误(例如,一列应该是整数,但有时会插入一个浮点数),你仍然可以使用textscan并用更通用的格式说明符替换格式说明符。例如,在该示例中,您可以将
%d
(整数)替换为
%f
(浮点数)。因为所有整数都是浮点数,所以应该可以。在最极端的情况下,您可以将所有列作为字符串读取(
%s
),但无论如何,您都需要解析所有列,如果不使用
textscan

您需要提供一些示例数据,否则很难帮助您;)我不知道上面的例子能提供多少帮助:如果线路在没有丢失的地方断开,PIt会有帮助。请编辑您的问题,并将数据和代码添加为“代码示例”。这将保留所有线路制动器。您是对的,数据中的某些值存在错误。例如,sprrtn中有字符串值。但我的想法是将所有值提取到matlab中,然后检查NAs或INFS,如果我发现有错误值,如何删除它们并存储剩余值而不破坏顺序我更新了答案。使用textscan可能还有一个更简单的解决方案,但我只是习惯了regexp。我有点理解代码。现在,如果条件满足,我就不必做任何事情。但是我现在如何在ELSE条件下完全删除列呢?我添加了一些额外的行,使解决方案看起来像什么。在阅读文件时,我基本上使用了下面的示例代码:最后,数据应该包含所有有效数据,并且应该打印所有损坏的数据。如何删除错误。你能帮我解释一下如何去掉有错误的列吗