Вы можете получить позицию из Perl Text :: CSV_XS следующим образом:
perl -MText::CSV_XS -E 'open(my $fh, "<:encoding(utf8)", $ARGV[0]) or die "open: $!"; $csv = Text::CSV_XS->new({binary => 1, auto_diag => 9, diag_verbose => 1 } ); while (my $row = $csv->getline($fh)) { say tell $fh }' FILENAME.csv
Обратите внимание на FILENAME.csv
в конце строки.
После успешного анализа каждой строки будет напечатано смещение байт .
Распаковка однострочного файла:
use Text::CSV_XS;
use feature 'say';
open(my $fh, '<:encoding(utf8)', $ARGV[0]) or die "open: $!";
$csv = 'Text::CSV_XS'->new({'binary' => 1, 'auto_diag' => 9, 'diag_verbose' => 1});
while (my $row = $csv->getline($fh)) {
say tell $fh
}
Я отправил ему этот ошибочный CSS ( new.css
):
r1c1,"r1
c2",r1c3
r2c1,"r2c2,r2c3
r3c1,r3c2,r3c3
Вывод:
18
# CSV_XS ERROR: 2027 - EIQ - Quoted field not terminated @ rec 1 pos 15 field 2
(если перед поврежденной строкой было больше хороших строк, будет напечатано больше байтовых смещений. Используйте последнее.)
Итак, после байта 18 обнаружена ошибка. Достаточно легко получить номер строки из этого: head -c 18 new.csv | wc -l
, где указано 2 (количество хороших строк). Таким образом, ошибка находится в строке 3 - и действительно, кавычка вокруг r2c2 не закрыта.
На самом деле это упоминается на странице info
для od
(можно получить, запустив info od
или посетив https: //www.gnu .org / software / coreutils / manual / html_node / od-invocation.html # od-invocation , на который также есть ссылка в конце страницы руководства), хотя и не очень подробно:
Каждая строка вывода состоит из смещения на входе, за которым следуют группы данных из файла. По умолчанию od печатает смещение в восьмеричном формате, и каждая группа файловых данных представляет собой значение C short int, напечатанное как одно восьмеричное число.
Итак, в вашем выводе показаны восьмеричные числа 0000000, 0000020 и 0000030, которые являются десятичными 0, 16 и 24. Обратите внимание, что n
слова , записанного
, является 17-й символ (здесь байт) файла, поэтому его можно найти, начав чтение со смещения 16, а последняя строка новой строки - 24-й, поэтому следующая (пустая) строка вывода начинается со смещения 24.
Первый столбец в выходных данных od
представляет байтовое смещение в файле.