2015-03-30 3 views
2

Привет, у меня есть данные в текстовом файле, и я хотел прочитать данные внутри него.Чтение (m x n) разделенных запятыми строк файла .txt

2003,04,15,15,15,00,38.4279,-76.61,1565,3.7,0.0,38.19,-999,-999,3.9455,3.1457,2.9253 

2003,04,15,16,50,00,38.368,-76.5,1566,3.7,0.0,35.01,-999 

2003,04,15,17,50,00,38.3074,-76.44 

Я использовал следующие коды:

a= zeros(4460,216); 
nl = a(:,1); 
nc = a(1,:); 

if fid>0 
    for i = 1:length(nl) 
    d = textscan(Ligne,'%f','whitespace',','); 
    numbers = d{:}';  
    D = a(i) + numbers; 
    i = i+1; 
    end 
    Ligne = fgetl(fid); 
end 

Проблема заключается в том, что я не могу реализовать матрицу D. Данные заменяются каждый раз. Может кто-нибудь мне помочь?

+0

Не могли бы вы принять ответ или обновить свой вопрос в случае, если у вас все еще есть проблемы? – Cat

ответ

2

Предположим, что ваш файл выглядит следующим образом:

Header 
Header 
Header 

2003,04,15,15,15,00,38.4279,-76.61,1565,3.7,0.0,38.19,-999,-999,3.9455,3.1457,2.9253 

2003,04,15,16,50,00,38.368,-76.5,1566,3.7,0.0,35.01,-999 

2003,04,15,17,50,00,38.3074,-76.44 

В примере у вас есть headerlines и ограничитель ','. Теперь просто использовать importdata как очень удобной функции импорта:

X = importdata('myData.txt',',',4) 

, который возвращает:

X = 

      data: [3x17 double] 
     textdata: {4x17 cell} 
    colheaders: {1x17 cell} 

X.data содержит ваши цифровые данные. Поскольку данные в вашем файле имеют различное количество записей в каждой строке, Отсутствующие значения заполняются NaN. X.textdata содержит пропущенные строки заголовков в виде строк.

Вы можете обрабатывать их, в случае необходимости с TextScan:

additionalInformation = textscan(X.textdata, ...) 

suggested by Shai Альтернативой с использованием csvread с строка смещения устанавливается в делает работу, а также. Но имейте в виду, что недостающие значения заменяются нулями, что мне лично не нравится для дальнейшей обработки данных. Тем более, что ваши фактические данные также содержат нули.

X = csvread('myData.txt',4) 
+0

привет, извините за поздний ответ. Importdata также отлично работает. Спасибо за помощь. – Sevian

0

Считаете ли вы использование csvread?

D = csvread(filename); 

Что касается вашего кода, у вас есть две основные ошибки

  1. D = a(i)+numbers; - вы на самом деле переопределить D на каждой итерации. Попробуйте D(i,:) = a(i,:)+numbers; вместо этого

  2. i=i+1; - вы меняете переменную цикла внутри цикла! если вы используете for -loop на i, вам не нужно увеличивать его вручную.

И некоторые комментарии:

  1. Это лучший not to use i as a variable name in Matlab.

  2. Вы предварительно выделили a, но не D, рассмотрите предварительное распределение D.

+0

Да, проблема в том, что у меня мало данных в строковом формате в верхней части файла, вот почему им читается строка за строкой. Если я использую .csv, мне нужно удалить данные сверху. – Sevian

+1

@Sevian Присмотритесь к документу. Вы можете пропустить заголовок вашего файла, указав смещение строки. – thewaywewalk

0

Вы уже сказали это: D заменяется каждый раз. Это происходит, так как вы не указали индексы при доступе к D. Вы должны сделать что-то вроде

D = zeros(size(a)) 
.... 
if ... 
    for ... 
    ... 
    D(i) = a(i) + numbers; 
    ... 
    end 
end 

Но, как Шай отметил, что может быть более простым решением вашей проблемы.

0

Наконец, я использовал эти строки кода. D = NaN (размер (а)); i = 1;

while ~(Ligne==-1) 

    d = textscan(Ligne,'%f','whitespace',','); 
    numbers = d{:}';  
    D(i,:) = numbers; 
    Ligne = fgetl(fid); 
    i=i+1; 

end 
+0

Но по какой причине? Этот код настолько медленный по сравнению с другими предоставленными ответами. – thewaywewalk

+0

У меня есть приблизительно 100 ненужных строк других данных перед данными, которые я хотел извлечь из .txt-файла. Поэтому мне нужен автоматический код для чтения всех файлов, имеющих такой формат. Мне пришлось читать по очереди, чтобы извлечь необходимую информацию. Я обязательно сохраню ваши коды, которые могут помочь в будущем. Огромное спасибо. – Sevian

+0

Я понимаю. Но тогда вы все равно должны использовать 'X = importdata (...)', а затем просто используйте textscan для своего заголовка с помощью '... = textscan (X.textdata, ...)'. Посмотрите мой отредактированный ответ, чтобы понять, что я имею в виду. На самом деле не очень быстро читать все ваши данные по строкам, если вы можете загрузить их сразу. – thewaywewalk

Смежные вопросы