Как мне написать текстовый файл в том же формате, в котором он читается в MATLAB? - PullRequest
1 голос
/ 15 декабря 2009

Я задавал связанный вопрос в прошлом, и я знаю, как прочитать файл, благодаря помощи экспертов здесь. Теперь у меня новая проблема. Я сначала читаю данные из файла примерно так:

fid = fopen('D:\file.txt', 'rt');
a = textscan(fid, '%s %f %f %f %f %f %f', ...
             'Delimiter',',', 'CollectOutput',1, 'HeaderLines',1);
fclose(fid);

Затем я обрабатываю файл и изменяю несколько значений столбца. Теперь я хочу написать новый файл newfile.txt в том же формате, что и мой file.txt с новыми значениями. Как мне это сделать?

Если я сделаю следующее:

M = [datenum(a{1}) a{2}];
dlmwrite('newfile1.txt', M);

он дает мне новый файл без моего первого ряда заголовков и без столбца 1 и столбца 2 в нужном мне формате.

Мой формат файла указан ниже:

date        time,   M01, M02, M03, M04, M05, M06
8/15/2009, 0:00:00, 5.8, 7.8, 7.8, 7.3, 0, 7.9
8/15/2009, 0:10:00, 7.1, 8.1, 8.1, 7.7, 0, 8.1
8/15/2009, 0:20:00, 6.8, 7.4, 7.6, 7.1, 0, 7.3
8/15/2009, 0:30:00, 5.6, 6.8, 7.1, 6.6, 0, 6.8
8/15/2009, 0:40:00, 3.9, 6.2, 6.4, 6.2, 0, 6.4
8/15/2009, 0:50:00, 4.6, 5.5, 6.1, 5.8, 0, 5.6
8/15/2009, 1:40:00, 7, 7, 7.2, 6.9, 0, 6.3

Я могу создать новый файл file.txt в формате

Мой формат файла указан ниже:

                5.8, 7.8, 7.8, 7.3, 0, 7.9
                7.1, 8.1, 8.1, 7.7, 0, 8.1
                6.8, 7.4, 7.6, 7.1, 0, 7.3
                5.6, 6.8, 7.1, 6.6, 0, 6.8
                3.9, 6.2, 6.4, 6.2, 0, 6.4
                4.6, 5.5, 6.1, 5.8, 0, 5.6
                7, 7, 7.2, 6.9, 0, 6.3

Может кто-нибудь помочь мне 2 скопировать заголовки и первые 2 столбца в этот новый файл?

Ответы [ 2 ]

1 голос
/ 15 декабря 2009

Примечание. Я обновил ответ для работы с самым последним форматом файла, указанным в вопросе (т. Е. Запятой между значениями даты и времени). Я также написал код ниже для обработки очень больших файлов, в которых число столбцов известно, но количество строк является переменным.

Сначала вам нужно будет прочитать ваш файл, используя следующий обновленный код (который сохраняет верхнюю строку с помощью функции FGETS ):

fid = fopen('D:\file.txt','rt');  %# Open the file
topLine = fgets(fid);             %# Read the top line and store it in a string
data = textscan(fid,'%f','Delimiter',',/:');  %# Read the data
fclose(fid);                      %# Close the file

Далее необходимо изменить форму data, используя известное количество столбцов данных ( не , считая столбцы даты и времени):

N = 74;  %# Number of columns of data after the date and time
data = reshape(data{1},N+6,[])';

Теперь data - это матрица, в которой первые шесть столбцов содержат информацию о дате и времени (месяц, день, год, часы, минуты и секунды), а все остальные данные находятся в оставшихся столбцах N. Если вам нужно что-либо сделать со значениями даты и времени, вы можете посмотреть на следующие функции, чтобы выяснить, как преобразовать их в различные форматы: DATENUM , DATESTR и DATEVEC .

После изменения значений в data вы можете восстановить его, используя цикл for и функцию FPRINTF :

fid = fopen('newfile1.txt','wt');  %# Open the file
fprintf(fid,'%s',topLine);         %# Print the top line
for i = 1:size(data,1)             %# Loop over the rows of data
  fprintf(fid,'%d/%d/%d, %d:%d:%d',data(i,1:6));  %# Print the date
  fprintf(fid,', %.1f',data(i,7:end));            %# Print the data
  fprintf(fid,'\n');                              %# Print a newline
end
fclose(fid);                       %# Close the file

Я запустил приведенный выше код с матрицей 86400 на 80 для data, и запись данных в файл заняла около 30 секунд.

0 голосов
/ 15 декабря 2009

dlmwrite записывает переменную (например, ваш массив M) в файл в тексте ASCII, как вы знаете. Обратитесь к документации по функции, чтобы узнать, как установить символ разделителя (чтобы получить значение между значениями в каждой строке) и как добавить его в существующий файл.

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

Теперь, если вы хотите записать оставшуюся часть файла (массив M плюс 2 начальных столбца даты / времени), вам потребуется создать временный массив с размером, равным M, и 2 дополнительных столбца. Так как ваши значения данных являются числами с плавающей точкой, а ваши даты и время являются структурированными данными какого-то рода (возможно, строки), я думаю, что Mtemp должен быть массивом строк. Создав его, вы можете добавить его в выходной файл с помощью одного оператора dlmwrite.

Обратите внимание, что num2str работает так, как вы можете надеяться на векторы, но я не уверен, что его можно принудительно поместить между значениями. Однако он может записывать числа в указанном вами формате.

Если это не дает нужного вам результата, или ваш массив слишком велик для копирования и расширения, или у вас есть какая-то другая причина не любить предложенное решение, то я боюсь, что вам придется написать цикл для записывать вывод по одной строке и использовать низкоуровневые функции записи файлов.

Привет

Mark

...