Первая проблема, с которой нужно разобраться - это окончания строк. Использование freads
из стандартной библиотеки прочитает ваш текстовый файл и обеспечит завершение каждой строки LF, независимо от того, были ли строки изначально CRLF, CR или просто LF. Используйте fread
без левого аргумента, если вы хотите прочитать байты в точности так, как они были в файле.
Давайте в качестве примера воспользуемся следующим файлом, разделенным пробелом (numbers.txt
):
1 -3.93 17 -7 564
2 4.27 12 3 234
3 -1.90 22 5 728
4 0.00 10 -4 442
Вы можете прочитать файл следующим образом:
0 ". 'm' freads 'numbers.txt'
1 _3.93 17 _7 564
2 4.27 12 3 234
3 _1.9 22 5 728
4 0 10 _4 442
Под прикрытием 'm'
левый аргумент freads
делает это:
0 ". ];._2 freads 'numbers.txt'
;._2
говорит, что в качестве разделителя следует использовать последний байт в файле (который теперь LF
), удалите их из результата и примените глагол слева (в данном случае ]
) к каждой строке. Результатом является массив символов со строкой для каждой строки и столбцами, соответствующими самой длинной строке в файле (более короткие строки дополняются пробелами). Затем 0 ".
пытается проанализировать массив как числа, где он не может заменить входные данные на 0
(я часто использую _999
, так что более очевидно, что что-то не преобразовалось правильно).
Если файл разделен чем-то отличным от пробела, то вам нужно проанализировать поля, иначе вы получите интересные результаты:
0 ". ];._2 freads 'numbers.csv'
0 24.2712 0 0
Если это простой файл, вы могли бы попробуйте одно из следующего:
0 ". ];._2 ', ' charsub freads 'numbers.csv' NB. replace delimiter with spaces
1 _3.93 17 _7 564
2 4.27 12 3 234
3 _1.9 22 5 728
4 0 10 _4 442
0 ". > ','&cut;._2 freads 'numbers.csv' NB. box fields in each line
1 _3.93 17 _7 564
2 4.27 12 3 234
3 _1.9 22 5 728
4 0 10 _4 442
Если это более сложно (цитируемые разделители и c) или если вам просто проще, вы можете использовать tables/csv
или tables/dsv
аддоны:
load 'tables/csv'
0 ". > readcsv 'numbers.csv'
1 _3.93 17 _7 564
2 4.27 12 3 234
3 _1.9 22 5 728
4 0 10 _4 442
0 ". > ',' readdsv 'numbers.csv'
1 _3.93 17 _7 564
2 4.27 12 3 234
3 _1.9 22 5 728
4 0 10 _4 442