Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/104: Рейтинг темы: голосов - 104, средняя оценка - 4.97
52 / 47 / 19
Регистрация: 05.04.2015
Сообщений: 227
1

Чтение текстового файла

27.11.2015, 15:38. Показов 19035. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Люди добрые, помогите с одной проблемой разобраться! Есть текстовый файл в с набором данных (см. пример). Проблема состоит в том, чтобы получить доступ к последним четырем столбцам. Когда я читаю первые 4 столбца - никаких проблем нет, программа все читает. Но, когда я обращаюсь к 5-му и далее столбцам, тут начинаются чудеса - программа читает только до 5-ой строки!!! Хотел заполнить отсутствующие значения на NaN - но тоже ничего не получается.

fid = fopen('example.txt');
% T = textscan(fid, '%f%s%f%f %*[^\n]'); % для первых 4-х столбцов
T = textscan(fid, '%*f%*s%*f%*f%*f%*f%*s%f%f%f%f');
fclose(fid);
x = T{1};
y = T{2};
Вложения
Тип файла: txt example.txt (1.1 Кб, 87 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2015, 15:38
Ответы с готовыми решениями:

Чтение текстового файла
Добрый день! Есть текстовый файл, который надо прочесть. Фрагмент прикрепляю. Проблема в том, что...

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

Чтение информации из текстового файла
Здравствуйте! Помогите, пожалуйста, решить задачу. В текстовый файл записаны полные названия...

Чтение текстового файла с запятой в качестве разделителя
Здравствуйте! Помогите, пожалуйста, может кто-нибудь сталкивался с такой проблемой. Изображение у...

19
141 / 111 / 19
Регистрация: 14.04.2014
Сообщений: 224
Записей в блоге: 10
27.11.2015, 15:59 2
так у вас неоднородность в файле... сомневаюсь, что удастся иначе как построчно его прочитывать
1
52 / 47 / 19
Регистрация: 05.04.2015
Сообщений: 227
27.11.2015, 16:26  [ТС] 3
да, в этом и вся проблема что файл не полный, но по факту надо работать с этим файлом. Пока, я скачиваю этот файл, затем через Excel удаляю эти столбцы и спокойно читаю. Есть одна идея - это читать все столбцы не как %f, а как %s. В этом случае данные с последних столбцов "перераспределяются" на предыдущие и надо как то эти данные отделить. Короче, если кто сталкивался с такой проблемой, просьба откликнутся...
0
141 / 111 / 19
Регистрация: 14.04.2014
Сообщений: 224
Записей в блоге: 10
27.11.2015, 16:33 4
сталкивался.
варианты: или изменить формат файла (например, писать на пустые места символ какой-нить типа * или -), или читать построчно (оп сути, это не так уж и накладно, если файл не под ГБ)... Через конвертацию в xls тоже конечно можно, но тут вопрос стоимости - не дешевле ли просто читать построчно, будет ли хоть какой-нибудь выигрыш от конвертации?
0
52 / 47 / 19
Регистрация: 05.04.2015
Сообщений: 227
27.11.2015, 17:17  [ТС] 5
На самом деле этот пример формата .txt. А в реальности данные доступны онлайн по адресу http://datacenter.iers.org/eop... /latest/12. И смысл состоит в том, чтобы каждые пару месяцев я хочу обновлять мои данные с сайта. А вот на счет построчно читать - я пытался, но ничего не получилось. Может кто-нибудь подскажет?
0
9 / 9 / 3
Регистрация: 25.10.2015
Сообщений: 22
28.11.2015, 14:41 6
У вас файл форматирован по позициям символов. То есть 1:8 символы это первая колонка чисел, 9:11 это вторая колонка и тд. Смущает, что последняя строка "оборвана" и не заканчивается 0d0axHH... возможно это просто результат небрежного копирования куска исходного файла в "пример".
Во всяком случае, посмотрите этот код:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
fid=fopen('f:\example.txt');a=fread(fid,inf,'*uint8');fclose(fid);
L=find(a==10);
if L(end)+87<length(a),
   nC=length(L)+1;LL=[1;L(1:end)+1]; 
else
   nC=length(L);LL=[1;L(1:end-1)+1];
end;
dimC=zeros(nC,87);
for n=1:nC, dimC(n,:)=a(LL(n):LL(n)+86);end;
st1=char(dimC(:,9:11))
st2=char(dimC(:,47:49))
dimC(:,[9:11 47:49])=[];dimC0=repmat(48,nC,1);
dimC1=[dimC(:,1:8) dimC0 dimC(:,9:18) dimC0 dimC(:,19:28) dimC0 dimC(:,29:36) dimC0 dimC(:,37:43) dimC0 dimC(:,44:53) dimC0 dimC(:,54:62) dimC0 dimC(:,63:72) dimC0 dimC(:,73:81) dimC0];
dimC2=str2num(char(dimC1))
Специально пытался писать "для простоты дальнейшей правки", поэтому код выглядит чутка топорно.
87 -- количество "значащих" символов в строках файла перед пробелами.

Как видно из кода, я исходил из того, что числа в файле всегда с десятичной точкой. Если колонка целочисленная, то используйте dimC00=repmat([46 48],nC,1); ....

Вообще, если по-уму, то dimC лучше сразу переопределить в char: D=char(dimC),
потом читать каждую колонку данных с соответствующих знакомест, и через find заменять строку с пробелами на 0, а потом уже использовать str2num. ....да и строк оборванных, по вашей ссылке нет, что упрощает код.
0
52 / 47 / 19
Регистрация: 05.04.2015
Сообщений: 227
30.11.2015, 10:20  [ТС] 7
Спасибо, конечно, за ответ, но или у нас разные версии Матлаба (у меня 2015а), или я ничего не понял. Мне конкретно нужны столбы 16 (-99.920 ....) и 18 (-13.258 ...), т.е. условно х = 16-й столбец, у = 18-й столбец. Вот если бы ваш код выдавал такой результат, это было бы очень круто, потому что я сам через ж.... что то придумал и вроде работает.
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    URL = 'http://datacenter.iers.org/eop/-/somos/5Rgv/latest/12';  Str = urlread(URL);
    Format = '%*2f%*2f%*f%f%*1s%*f%*f%*f%*f%*1s%*f%*f%*s%f%*s%f%*f%f %*[^\n]';
    Cell = textscan(Str, Format);
    MJD = Cell{1};  colum1 = Cell{2};   colum2  = Cell{3};  colum3 = Cell{4}; 
    
    for i = 1:length(colum2)
     if find(abs(colum2(i) ./ colum2(i+1)) > 5 )
    formatSpec = ' Данные по dpsi и deps есть до строки %2d \n ';
    fprintf(formatSpec, i);
    index_dpsi = i;  
         break
     end
    end
    dpsi1 = colum2(1:i);
 
    for i = 1:length(colum1)
     if find(abs(colum1(i+1) ./ colum1(i)) > 1000 )
    formatSpec = ' Данные по dpsi и deps начинаются со строки %2d \n ';
    fprintf(formatSpec, i);
         break
     end
    end
    dpsi2 = colum1(i+1:end);
    dpsi = [dpsi1; dpsi2];
    num = find(~isnan(dpsi));  
    dpsi = dpsi(num); % убираем NaN
    
    i = find(~isnan(colum3));
    deps1 = colum3(i);
    deps2 = colum2(index_dpsi + 1:end);
    deps = [deps1; deps2];
    deps = deps(num); % убираем NaN
Основная идея состоит в том, что 13-й столбец (1.8146 и т.д.) я читаю не как '%f' а как '%s'. И так как этот столбец не полный, он берет значения с ближайшего правого столбца. И т.д. с каждым последующим столбцом. А так как величины в этих столбцах отличаются, я нахожу этот разрыв в столбце и потом объединяю два кусочка в единый.
0
9 / 9 / 3
Регистрация: 25.10.2015
Сообщений: 22
30.11.2015, 12:15 8
Странно... у меня работало..
Выложите, пожалуйста, пару примеров файлов "как они есть", а не кусок копипастой.
И еще, если есть, то описание к колонкам или описание формата... по ссылке я вижу, что сначала идет дата: "15 9 1 57266.00"... причем в своеобразном таком виде...
Сделаем вам функцию))
0
52 / 47 / 19
Регистрация: 05.04.2015
Сообщений: 227
30.11.2015, 13:43  [ТС] 9
Ссылка http://datacenter.iers.org/eop... /latest/12
Описание формата в прилагаемом файле. Нужны колонки 98-106 (dPSI) и 117-125 (dEPSILON).
0
52 / 47 / 19
Регистрация: 05.04.2015
Сообщений: 227
30.11.2015, 13:43  [ТС] 10
Описание формата
Вложения
Тип файла: txt readme.txt (1.7 Кб, 14 просмотров)
0
52 / 47 / 19
Регистрация: 05.04.2015
Сообщений: 227
30.11.2015, 13:47  [ТС] 11
или вот еще ссылка с большим количеством данных
http://datacenter.iers.org/eop... v/latest/8
0
Эксперт по математике/физике
3390 / 1913 / 571
Регистрация: 09.04.2015
Сообщений: 5,365
01.12.2015, 09:55 12
Лучший ответ Сообщение было отмечено murzik07 как решение

Решение

Если данные находятся в фиксированных колонках, то посмотри пример может поможет
Matlab M
1
2
3
4
5
6
7
8
clc
clear all
fid = fopen('example.txt');
T = textscan(fid, '%54c%f%f%69c');
fclose(fid);
x = T{1};
y = T{2}; 
z=T{3};
2
52 / 47 / 19
Регистрация: 05.04.2015
Сообщений: 227
01.12.2015, 10:34  [ТС] 13
спасибо, все работает.
0
31 / 31 / 4
Регистрация: 23.03.2014
Сообщений: 180
04.12.2015, 06:12 14
murzik07, как вариант- (matlab 2014a)
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
function A = uniread(site)
%[url]http://datacenter.iers.org/eop/-/somos/5Rgv/latest/8[/url]
InetFile = site;
A0=strcat('InetFile = "', InetFile,'"');
A1 = 'Dim objShell';
A2 = 'Set objShell = CreateObject("Wscript.Shell")';
A3 = 'localFile = objShell.SpecialFolders("Desktop") & "\text.txt"';
A4 = 'Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")';
A5 = 'oXMLHTTP.Open "GET", InetFile, 0';
A6 = 'oXMLHTTP.Send';
A7 = 'Set oADOStream = CreateObject("ADODB.Stream")';
A8 = 'oADOStream.Mode = 3';
A9 =  'oADOStream.Type = 1';
A10 = 'oADOStream.Open';
A11 = 'oADOStream.Write oXMLHTTP.responseBody';
A12 = 'oADOStream.SaveToFile localFile, 2';
A13 = 'Set oXMLHTTP = Nothing';
A14 = 'Set oADOStream = Nothing';
vbs = {A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14};
fid = fopen('infile.vbs','w');
fprintf(fid,'%s\n',vbs{:});
fclose(fid);    
system('infile.vbs &');
specialFolderType = System.Type.GetType(...
    'System.Environment+SpecialFolder');
folders = System.Enum.GetValues(specialFolderType);
enumArg = [];
for i = 1:folders.Length
    if (strcmp(char(folders(i)), 'Desktop'))
        enumArg = folders(i);
    break
    end
end
if(isempty(enumArg))
    error('Invalid Argument')
end
result = System.Environment.GetFolderPath(enumArg);
B = matlab.unittest.diagnostics.ConstraintDiagnostic.getDisplayableString(result);
C = strcat(B,'\text.txt');
A = fileread(C);
end
Matlab M
1
 uniread('http://datacenter.iers.org/eop/-/somos/5Rgv/latest/8')
0
52 / 47 / 19
Регистрация: 05.04.2015
Сообщений: 227
04.12.2015, 10:01  [ТС] 15
Крутая прога, спасибо. Но, как сделать так чтобы он записывал данные не на 'Desctop' а на флешку 'F:\MATLAB\АстроУОЛ\Data_IERS' (у меня ошибку выдает). И что делать с открывающимся окном командной строки?
0
31 / 31 / 4
Регистрация: 23.03.2014
Сообщений: 180
04.12.2015, 11:48 16
Цитата Сообщение от murzik07 Посмотреть сообщение
как сделать так чтобы он записывал данные не на 'Desctop' а на флешку 'F:\MATLAB\АстроУОЛ\Data_IERS'
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function A = uniread(site)
%[url]http://datacenter.iers.org/eop/-/somos/5Rgv/latest/8[/url]
InetFile = site;
A0=strcat('InetFile = "', InetFile,'"');
A3 = 'localFile = "F:\MATLAB\АстроУОЛ\Data_IERS\text.txt"';
A4 = 'Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")';
A5 = 'oXMLHTTP.Open "GET", InetFile, 0';
A6 = 'oXMLHTTP.Send';
A7 = 'Set oADOStream = CreateObject("ADODB.Stream")';
A8 = 'oADOStream.Mode = 3';
A9 =  'oADOStream.Type = 1';
A10 = 'oADOStream.Open';
A11 = 'oADOStream.Write oXMLHTTP.responseBody';
A12 = 'oADOStream.SaveToFile localFile, 2';
A13 = 'Set oXMLHTTP = Nothing';
A14 = 'Set oADOStream = Nothing';
vbs = {A0, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14};
fid = fopen('infile.vbs','w');
fprintf(fid,'%s\n',vbs{:});
fclose(fid);    
system('infile.vbs &');
A = fileread('F:\MATLAB\АстроУОЛ\Data_IERS\text.txt');
end
Цитата Сообщение от murzik07 Посмотреть сообщение
И что делать с открывающимся окном командной строки?
странно у меня закрывается автоматически после того как скрипт отработал
1
52 / 47 / 19
Регистрация: 05.04.2015
Сообщений: 227
04.12.2015, 13:12  [ТС] 17
О, спасибо. Как я понимаю ты крутой прогер. Тогда вот такой вопрос (если будет время) - вот по этому адресу есть http://webhome.weizmann.ac.il/... ation.html одна программа, которую я очень хочу установить на компьютер но у меня ошибку выдает (см. рисунок). Очень большая просьба помочь
Миниатюры
Чтение текстового файла  
0
31 / 31 / 4
Регистрация: 23.03.2014
Сообщений: 180
04.12.2015, 23:45 18
Цитата Сообщение от murzik07 Посмотреть сообщение
но у меня ошибку выдает
Instellation script (Linux) - установка под линукс - нет возможности проверить

Individual functions can be downloaded through the table of functions webpage. - можно загрузить отдельные функции, ссылка -

http://webhome.weizmann.ac.il/... ntent.html

попробуйте по отдельности установить
необходимые компоненты
0
52 / 47 / 19
Регистрация: 05.04.2015
Сообщений: 227
06.12.2015, 14:43  [ТС] 19
А дело в том, что по отдельным компонентам не хватает одной М-функции. Есть программа tri_match_lsq.m которая после запуска выдает ошибку, что не хватает test_match. А этой функции нет в общем списке. Вот я и думаю, что она как то при полной установке появляется....???
0
31 / 31 / 4
Регистрация: 23.03.2014
Сообщений: 180
07.12.2015, 05:46 20
murzik07, возможно, если у вас windows попробуйте через virtualbox установить linux и запустить install_astro_matlab.m

в install_astro_matlab.m там ряд ошибок, возможно в linux заработает )

windows версии компонентов DS9 - http://ds9.si.edu/site/Download.html
xpa - http://ds9.si.edu/site/XPA.html
0
07.12.2015, 05:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2015, 05:46
Помогаю со студенческими работами здесь

Редактирование текстового файла
Здравствуйте, есть текстовый файл для управления программой. Мне нужно найти этом файле...

Считывание с текстового файла
Здравствуйте. У меня вот такой вопрос. Мне нужно загружать данные из текстового файла в М-файл...

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

Считывание столбцов текстового файла
Подскажите пожалуйста, как прочитать матлабом текстовый файл по столбцам и записать всё это в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru