Как объединить два текстовых файла в Matlab и продублировать полученный файл?

Мне нужно сгенерировать несколько текстовых (или dat) файлов для загрузки в другое программное обеспечение. У меня есть два текстовых файла (aa.txt и bb.txt) и уравнение, которое генерирует случайные числа.

Созданный текстовый файл (или .dat) должен состоять из трех частей:

1- Содержимое aa.txt. 2- Случайно сгенерированные числа. 3- содержимое bb.txt.

содержимое файлов:

аа.txt -->

first file ,,, first line

First file ,,, second line

1234.1234

bb.txt -->

second file ,,, first line

second file ,,, second line

6789.6789

Я написал следующий код, но он создаст только один файл с содержимым первого исходного файла (aa.txt). Почему я получаю 1 файл? Почему переменная A не записана в сгенерированном файле?

NOF =3;                     % start with a goal to produce 3 files (small scale)
for ii = 1:NOF        
ffid= fopen ('aa.txt','r');    % open the first source file (aa.txt), the idntifier is ffid
df = fopen (['file' sprintf('%d',ii) '.txt'], 'a'); % open a new (destination) file the identifier is df
line=fgets (ffid);            % Read line from first source file

while ischar (line) 
    fprintf ('%s\n',line);
    line =fgets (ffid);
    fprintf (df , line);    % write the newly-read line from first file to the destination file
end
fclose (ffid);               % closing the first source file

A=randn(2,2); % this is just a randonly generated value for checking purposes and will be replaced later with a many sets of equations
save (['file' sprintf('%d',ii) '.txt'],'A', '-append');


sfid=fopen ('bb.txt','r');      % open the second source file, the idntifier is sfid
line2=fgets (sfid);             % Read line from source file

while ischar (line2)
    fprintf ('%s\n',line2);
    line2 =fgets (sfid);
    fprintf (df , line2);
end
fclose (sfid);                  % closing the first source file
end
fclose (df);
fclose('all');

person a_new_moody    schedule 06.04.2018    source источник
comment
Можете ли вы также показать, что находится в файлах txt? небольшой 2-строчный пример?   -  person Ander Biguri    schedule 06.04.2018
comment
Я не думаю, что вы можете save там, где вы это делаете, даже если вы добавляете, потому что файл открыт (df).   -  person Ander Biguri    schedule 06.04.2018
comment
@AnderBiguri Пожалуйста, найдите содержимое добавленных файлов. Примечание. Я добавил содержимое файлов в вопрос aa.txt --› первый файл ,,, первая строка Первый файл ,,, вторая строка 1234.1234 bb.txt --› второй файл ,,, первая строка второй файл ,, , вторая строка 6789,6789   -  person a_new_moody    schedule 06.04.2018
comment
Вы можете использовать системную команду и использовать оболочку для эха в файл: f = ['file' sprintf('%d',ii) '.txt']; system(sprintf('aa.txt > %s && echo %f >> %s && bb.txt >> %s', f, randn(2,2), f))   -  person rahnema1    schedule 06.04.2018


Ответы (1)


Это должно в основном производить то, что вы ищете:

for ii = 1:3
    % Create the output file...
    fid_out = fopen(['file' num2str(ii) '.txt'],'w');

    % Read the whole content of the first file into the output file...
    fid_aa = fopen('aa.txt','r');

    while (~feof(fid_aa))
        fprintf(fid_out,'%s\n',fgetl(fid_aa));
    end

    fclose(fid_aa);

    % Generate the random matrix and write it to the output file...
    random = cellstr(num2str(randn(2)));

    for jj = 1:numel(random)
        fprintf(fid_out,'%s\n',random{jj});
    end

    % Read the whole content of the second file into the output file...
    fid_bb = fopen('bb.txt','r');

    while (~feof(fid_bb))
        fprintf(fid_out,'%s\n',fgetl(fid_bb));
    end

    fclose(fid_bb);

    % Finalize the output file...
    fclose(fid_out);
end

Дан, например, файл aa.txt со следующим содержимым:

A - Line 1
A - Line 2
A - Line 3

и файл bb.txt следующего содержания:

B - Line 1
B - Line 2
B - Line 3

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

A - Line 1
A - Line 2
A - Line 3
0.18323     0.94922
-1.0298     0.30706
B - Line 1
B - Line 2
B - Line 3

Ради оптимизации, поскольку ввод-вывод очень дорог, я предлагаю вам прочитать содержимое aa.txt и bb.txt только один раз вне цикла, создающего выходные файлы, и сохранить их содержимое в массивы ячеек. Вот как:

fid = fopen('file.txt','r');
data = cell(0);

while (~feof(fid))
    data{end+1} = fgetl(fid);
end

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

for jj = 1:numel(data)
    fprintf(fid_out,'%s\n',data{jj});
end
person Tommaso Belluzzo    schedule 06.04.2018
comment
Спасибо @TommasoBelluzzo, это действительно помогло - person a_new_moody; 08.04.2018