MATLAB ЧТЕНИЕ ФАЙЛА

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

1 1 -1 1 1 -1 -1 1 1 1 -1 1

1 -1 1 -1 -1 1 1 1 1 -1 1 1

sgfgdf

1 1 1 -1 1 -1 1 -1 -1 -1 -1 1

rtydsfdsfds

1 -1 1 -1 -1 -1 1 1 -1 -1 -1 1

1 1 -1 1 1 -1 -1 -1 1 -1 1 -1

1 -1 1 1 1 1 1 -1 -1 -1 1 -1

что я пробовал до сих пор:

d = fopen('transmission_data.txt')

R = textscan(d, '%f %f', 'headerLines', 3:5)

fclose (д)

но это не работает, так как мне нужно указать только одно число для текстового сканирования, например, «3», это избавит от первых 3 строк, но я хочу специально избавиться от третьей и пятой. может быть, есть какой-то другой способ чтения данных? Помощь приветствуется :)

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


person George Randall    schedule 08.10.2013    source источник


Ответы (2)


Прочитайте файл fileread, разделите его на regexp и попросите textscan найти все числа:

C = regexp(fileread('transmission_data.txt'), '(\n|\r)*', 'split');
C = C(~cellfun('isempty', C));
D = cellfun(@(c) textscan(c, '%f'), C);
R = [D{:}].';

Важным моментом здесь является то, что когда textscan встречает строку, не содержащую чисел, она возвращает пустую матрицу, поэтому, когда вы объединяете результирующие векторы, вы просто получаете те, которые исходят из строк, не являющихся строками. Для вашего примера этот код возвращает

>> R
R =
     1     1    -1     1     1    -1    -1     1     1     1    -1     1
     1    -1     1    -1    -1     1     1     1     1    -1     1     1
     1     1     1    -1     1    -1     1    -1    -1    -1    -1     1
     1    -1     1    -1    -1    -1     1     1    -1    -1    -1     1
     1     1    -1     1     1    -1    -1    -1     1    -1     1    -1
     1    -1     1     1     1     1     1    -1    -1    -1     1    -1
person Mohsen Nosratinia    schedule 08.10.2013
comment
я кажется получаю ошибку ??? Ошибка при использовании ==› textscan Первый ввод не может быть пустым. Ошибка в ==› @(c)textscan(c,'%f') Ошибка в ==›q1a на 38 D = cellfun(@(c) textscan(c, '%f'), C); - person George Randall; 08.10.2013
comment
@GeorgeRandall по какой-то причине у вас были пустые строки в C. Я добавил строку, чтобы удалить их. Теперь это должно работать. - person Mohsen Nosratinia; 08.10.2013

Вот один из способов сделать это:

  1. Используйте мастер импорта
  2. Выберите массив ячеек или матрицу в желаемой форме
  3. Выберите удалить строки с недопустимыми значениями
  4. Нажмите импорт

Если вам нужно автоматизировать это, вы можете позволить мастеру импорта сгенерировать код за вас.


Вот (довольно подробный) код, сгенерированный мастером импорта, когда я использую его для ваших данных в файле с именем test.txt.

%% Import data from text file.
% Script for importing data from the following text file:
%
%    \\invol-vs-fp1\Users$\d.jaheruddin\MATLAB\test.txt
%
% To extend the code to different selected data or a different text file,
% generate a function instead of a script.

% Auto-generated by MATLAB on 2013/10/08 14:39:30

%% Initialize variables.
filename = 'test.txt';
delimiter = ' ';

%% Read columns of data as strings:
% For more information, see the TEXTSCAN documentation.
formatSpec = '%s%s%s%s%s%s%s%s%s%s%s%s%[^\n\r]';

%% Open the text file.
fileID = fopen(filename,'r');

%% Read columns of data according to format string.
% This call is based on the structure of the file used to generate this
% code. If an error occurs for a different file, try regenerating the code
% from the Import Tool.
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true,  'ReturnOnError', false);

%% Close the text file.
fclose(fileID);

%% Convert the contents of columns containing numeric strings to numbers.
% Replace non-numeric strings with NaN.
raw = [dataArray{:,1:end-1}];
numericData = NaN(size(dataArray{1},1),size(dataArray,2));

for col=[1,2,3,4,5,6,7,8,9,10,11,12]
    % Converts strings in the input cell array to numbers. Replaced non-numeric
    % strings with NaN.
    rawData = dataArray{col};
    for row=1:size(rawData, 1);
        % Create a regular expression to detect and remove non-numeric prefixes and
        % suffixes.
        regexstr = '(?<prefix>.*?)(?<numbers>([-]*(\d+[\,]*)+[\.]{0,1}\d*[eEdD]{0,1}[-+]*\d*[i]{0,1})|([-]*(\d+[\,]*)*[\.]{1,1}\d+[eEdD]{0,1}[-+]*\d*[i]{0,1}))(?<suffix>.*)';
        try
            result = regexp(rawData{row}, regexstr, 'names');
            numbers = result.numbers;

            % Detected commas in non-thousand locations.
            invalidThousandsSeparator = false;
            if any(numbers==',');
                thousandsRegExp = '^\d+?(\,\d{3})*\.{0,1}\d*$';
                if isempty(regexp(thousandsRegExp, ',', 'once'));
                    numbers = NaN;
                    invalidThousandsSeparator = true;
                end
            end
            % Convert numeric strings to numbers.
            if ~invalidThousandsSeparator;
                numbers = textscan(strrep(numbers, ',', ''), '%f');
                numericData(row, col) = numbers{1};
                raw{row, col} = numbers{1};
            end
        catch me
        end
    end
end


%% Exclude rows with non-numeric cells
J = ~all(cellfun(@(x) (isnumeric(x) || islogical(x)) && ~isnan(x),raw),2); % Find rows with non-numeric cells
raw(J,:) = [];

%% Create output variable
test = cell2mat(raw);
%% Clear temporary variables
clearvars filename delimiter formatSpec fileID dataArray ans raw numericData col rawData row regexstr result numbers invalidThousandsSeparator thousandsRegExp me J;
person Dennis Jaheruddin    schedule 08.10.2013
comment
как бы я ни хотел использовать importwizard, на самом деле мне приходится использовать альтернативный способ, который требует от меня написания кода - person George Randall; 08.10.2013
comment
@GeorgeRandall Если вы хотите написать код, я рекомендую вам основывать его на коде, сгенерированном мастером импорта, возможно, на некоторых строках с importdata в основе. Попробуйте прочитать эту команду, если вы не можете интерпретировать код. - person Dennis Jaheruddin; 08.10.2013
comment
importwizard и importdata не работают, потому что они могут читать только первые 2 строки данных - person George Randall; 08.10.2013
comment
@GeorgeRandall Смотрите мой обновленный пост, включая пример. - person Dennis Jaheruddin; 08.10.2013