Как я могу извлечь данные из текстового файла?

Текстовый файл следующим образом:

  1. Разделитель: пространство
  2. Таблица: 3,496,080 (строка) x 6 (столбец)
  3. Столбец: год
  4. Столбец B: День года
  5. Столбец C: Час
  6. Столбец D: один из 30, 32.5, 35, 37.5, 40 и 45 значений
    • Значения столбца E начинаются 25 и конец с 45 и последовательно увеличиваются на 5 после пяти строк.
  7. Столбец E: одно из 25,30,35,40 и 45 значений
    • Значения столбца D начинаются 30 и конец с 45 и последовательно увеличиваются на 2,5 после 499 440 строк после.
  8. F colum: Значение

    • A, B, и столбец C запускаются после 499 440 строк.
         1st row: 1998 152 1   30  25 12.5
   499,441st row: 1998 152 1  32.5 25 11.6
1998 152 1 30 25 12.5
1998 152 1 30 30 12
1998 152 1 30 35 11.8
1998 152 1 30 40 11.9
1998 152 1 30 45 12
1998 152 3 30 25 10.9
1998 152 3 30 30 10.7
1998 152 3 30 35 10.6
1998 152 3 30 40 10.5
1998 152 3 30 45 10.4
1998 152 5 30 25 9.6
1998 152 5 30 30 9.5
1998 152 5 30 35 9.2
1998 152 5 30 40 9
1998 152 5 30 45 8.7
1998 152 7 30 25 8.4
1998 152 7 30 30 8.5
1998 152 7 30 35 8.9
1998 152 7 30 40 9.6
1998 152 7 30 45 10.7
1998 152 9 30 25 13.2
1998 152 9 30 30 14.3
1998 152 9 30 35 15.2
1998 152 9 30 40 15.9
1998 152 9 30 45 16.2
1998 152 11 30 25 16.2
1998 152 11 30 30 16.5
1998 152 11 30 35 16.8
1998 152 11 30 40 17.2
1998 152 11 30 45 17.9
1998 152 13 30 25 18
1998 152 13 30 30 18.6
1998 152 13 30 35 19.3
1998 152 13 30 40 20.1
1998 152 13 30 45 21.2
1998 152 15 30 25 20.4
1998 152 15 30 30 21.4
1998 152 15 30 35 22.5
1998 152 15 30 40 23.7
1998 152 15 30 45 25
1998 152 17 30 25 21.8
1998 152 17 30 30 23.2
1998 152 17 30 35 24.7
1998 152 17 30 40 26
1998 152 17 30 45 26.9
1998 152 19 30 25 22.4
1998 152 19 30 30 23.4
1998 152 19 30 35 24.3
1998 152 19 30 40 25
1998 152 19 30 45 25.6
1998 152 21 30 25 25.1
1998 152 21 30 30 25
1998 152 21 30 35 24.3
1998 152 21 30 40 23.3
1998 152 21 30 45 22
1998 152 23 30 25 20.9
1998 152 23 30 30 19
1998 152 23 30 35 17.2
1998 152 23 30 40 15.7
1998 152 23 30 45 14.5

Я хотел бы извлечь все строки и затем записать данные в текстовый файл, который является D = 30 и E=25 и B> =152 и B <=241.

fid=fopen('table.txt','r');
formats='%f';
RawData=fscanf(fid,formats);

fclose(fid);

L=length(RawData);

fileID=fopen('test.txt','w');

Что я попробовал

Я попробовал Matlab кодом ниже, но это очень медленно:

for i=1:L/6

    data(i,:)=RawData((i-1)*6+1:(i-1)*6+6)';


    if data(i,4)==30
        if data(i,5)==25
            if data(i,2)>=152 && data(i,2)<=241
                    fprintf(fileID,'%d %d %d %d %d %3.1f \n',data(i,:));
             end
          end
     end


end
4
задан 19 March 2019 в 05:31

3 ответа

Я хотел бы извлечь все строки и затем записать данные в текстовый файл, который является D = 30 и E=25 и B> =152 и B <=241.

Это должно быть просто в Awk

awk '$4==30 && $5==25 && $2>151 && $2<242' file > newfile

Входные и выходные разделители полей по умолчанию являются пробелом.

7
ответ дан 23 November 2019 в 11:42

Комментарий: если Вы пишете вложенный операторы, при бесспорном выполнении его неправильно. Так, даже в MATLAB, который всегда будет медленнее, чем системные вызовы, после того как Вы загрузили эти данные в большой массив, сделайте что-то как

my_output = data(data(:,2)>=152 & data(:,2)<=241 &data(:,4)==30 & data(:,5)==25,:)

и превратите это в a table() и запишите это в свой вывод.

2
ответ дан 23 November 2019 в 11:42

Можно пользоваться библиотекой TextQL для записи SQL-запросов для извлечения данных из текстового файла.

Можно установить его с помощью следующей команды (я полагаю, что это только доступно с 18,04, или иначе необходимо было бы установить в другом отношении, докер, или из источника):

sudo apt install textql

В Вашем случае команда была бы:

textql -sql "select * where c3=30 and c4=25 and c1>=152 and c1<=241" \
 -dlm='0x20' \
 -output-dlm='0x20' \
 <file-name>

Объяснение:

  • -sql "select * where c3=30 and c4=25 and c1>=152 and c1<=241"

    Нормальный SQL-запрос, from опущен, поскольку это не нужно в этом случае. Так как Ваш файл не имеет заголовков столбцов, имена по умолчанию столбцов c0 для первого столбца, c1 для второго столбца, c2 для третьего столбца, и т.д.

  • -dlm='0x20'

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

  • output-dlm='0x20'

    Этот параметр должен сказать команде использовать пробел в качестве разделителя в выводе вместо запятой по умолчанию ,.

  • <file-name>

    Это должно быть изменено на использование путь фактического имени файла.

2
ответ дан 23 November 2019 в 11:42

Другие вопросы по тегам:

Похожие вопросы: