Чтение текстового файла с несколькими пробелами - PullRequest
0 голосов
/ 12 октября 2018

Что я хочу сделать и до сих пор успешно делал

Я использую Scilab 5.5.2 и написал общий интерактивный скрипт, который должен читать числовые данные из текстового файла (* .csv, * .txt) в матричную переменную.Это должно быть достаточно общим, чтобы читать большинство текстовых файлов напрямую.

Я успешно использовал csvRead.Он очень гибкий и читает почти все текстовые файлы с данными, даже с заголовками и т. Д.

Проблема

Но csvRead завершается неудачно, если текстовый файл содержит несколько пробелов в качестве разделителя данных,Это означает, что он принимает каждый пробел в качестве разделителя и, конечно, запутывается в различном количестве столбцов.

fscanfMat работает отлично с несколькими пробелами, если файл имеет только подключенные заголовкибез пустых строк, но файлы часто выглядят так:

MONTHLY MEAN CENTRAL ENGLAND TEMPERATURE (DEGREES C)                                     
1659-1973 MANLEY (Q.J.R.METEOROL.SOC., 1974)                                             
1974 ON PARKER ET AL. (INT.J.CLIM., 1992)                                                
PARKER AND HORTON (INT.J.CLIM., 2005)                                                    


           JAN   FEB   MAR   APR   MAY   JUN   JUL   AUG   SEP   OCT   NOV   DEC     YEAR
 1659      3.0   4.0   6.0   7.0  11.0  13.0  16.0  16.0  13.0  10.0   5.0   2.0     8.87
 1660      0.0   4.0   6.0   9.0  11.0  14.0  15.0  16.0  13.0  10.0   6.0   5.0     9.10

Я знаю, что могу отредактировать и преобразовать файл в электронную таблицу, сохранить его как csv, а затем прочитать его с помощью csvRead, но я бынравится читать этот общий вид файлов напрямую.Помните, что я не хочу читать этот файл явно, только файлы такого типа.

Мои попытки

1) strsubst - не работает

МойПопытка только для файлов такого типа (которая содержит пробел в качестве разделителя):

fid=mopen("readblanks.txt","r"); // data file w/ multiple blanks and header
mat=mgetl(fid); // Read data as lines of strings in a matrix of strings
x=7; // Lines to skip for the header, normally prompted by the user
mat=mat(x+1:$,:); // Crop header lines

//// Following command just remove the first multiple blanks and I don't get this
//// to EOF as expected.
mat=strsubst(mat,"/[\s]+/", " ", "r"); // Replace multiple blanks w/ one blank

//// Convert string matrix to numerical matrix.

mclose(fid)

Проблемы описаны за ////.Я просто хочу получить числовые данные в матрице.Мне не нужны заголовки.

2) переписать обрезанный заголовок файл и прочитать обратно - работает, но очень глупо

Это возможный способ сделать это, но очень не изящно и времяиспользование больших файлов

fid1=mopen("readblanks.txt","r"); // data file w/ multiple blanks and header
mat=mgetl(fid1); // Read data as lines of strings in a matrix of strings
x=7; // Lines to skip for the header, normally prompted by the user
mat=mat(x+1:$,:); // Crop header lines
mclose(fid1);

fid2=mopen(TMPDIR + "/tmp.dat.txt","wt"); // temporary file
mfprintf(fid2, "%s\n", mat); // write header-purged temporary file
mat=fscanfMat(TMPDIR + "/tmp.dat.txt"); // read temporary file in matrix variable
mclose(fid2);
mdelete(TMPDIR + "/tmp.dat.txt"); // clean up
disp(mat)

У вас есть идея получше?Это должно быть обычной проблемой, но я не нашел элегантного решения.

Спасибо.

...