Você pode obter uma posição do Text :: CSV_XS do perl assim:
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
Observe o FILENAME.csv
no final da linha.
Após analisar com sucesso cada linha, ele imprimirá o deslocamento byte .
Desembalando o one-liner:
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
}
Eu o alimentei com esse CSS defeituoso ( new.css
):
r1c1,"r1
c2",r1c3
r2c1,"r2c2,r2c3
r3c1,r3c2,r3c3
Saída:
18
# CSV_XS ERROR: 2027 - EIQ - Quoted field not terminated @ rec 1 pos 15 field 2
(se houvesse mais linhas boas antes do corrompido, haveria mais offsets de bytes impressos. Use o último.)
Então, depois do byte 18, ele encontrou um erro. Fácil o suficiente para obter um número de linha a partir disso: head -c 18 new.csv | wc -l
, que diz 2 (o número de linhas boas). Portanto, o erro está na linha 3 - e de fato é, a citação em torno de r2c2 não está fechada.