Não é possível fazer cabeça ou cauda para um arquivo

2

Eu tenho um arquivo .CSV que, ao passar o comando file test_file.csv , fornece a saída como:

test_file.csv: ISO-8859 English text, with CR line terminators

Quando estou usando o comando cat, head or tail no arquivo, ele está me retornando o conteúdo total do arquivo na tela. Como faço para converter os terminadores de linha para que eu possa usar esses comandos e usar o arquivo para processamento adicional. Além disso, eu queria saber se existe uma maneira de saber como esse arquivo foi gerado / criado? Por favor sugira.

    
por Dhruuv 07.01.2014 / 23:45

2 respostas

5

A única coisa que eu sei é que normalmente usamos um CR como terminador de linha em sistemas Mac antigos (antes do Mac OS X), mas a menos que seja um arquivo muito antigo que parece improvável.

Em qualquer caso, o programa mac2unix no pacote dos2unix deve ser capaz de corrigi-lo para você.

    
por 07.01.2014 / 23:49
2

O comando file está mostrando que o conjunto de caracteres do arquivo é ISO-8859 em inglês, você pode usar o comando iconv para converter arquivos de um conjunto de caracteres para outro.

Exemplo

Para começar, temos o seguinte arquivo.

$ file a.srt 
a.srt: ISO-8859 English text, with CRLF line terminators

Agora vamos converter o arquivo de ISO-8859-15 para utf-8 . Aqui estamos levando o arquivo a.srt para b.srt .

$ iconv -f ISO-8859-15 -t utf-8 a.srt > b.srt

Agora, o novo arquivo b.srt está no formato UTF-8 .

$ file b.srt 
b.srt: UTF-8 Unicode English text, with CRLF line terminators

E os terminadores de linha CRLF?

Estes são típicos de arquivos que vêm de um PC. Em um PC, o fim das linhas é finalizado com um retorno de carro e um avanço de linha. Você pode ver esses caracteres se usar uma ferramenta como hexdump .

Exemplo

hexdump -C b.srt | head -5
00000000  31 0d 0a 30 30 3a 30 30  3a 31 36 2c 33 30 32 20  |1..00:00:16,302 |
00000010  2d 2d 3e 20 30 30 3a 30  30 3a 31 39 2c 36 38 30  |--> 00:00:19,680|
00000020  0d 0a 3c 69 3e 54 68 65  20 63 69 74 79 27 73 20  |..<i>The city's |
00000030  63 61 6c 6c 65 64 20 44  75 6b 65 0d 0a 54 68 65  |called Duke..The|
00000040  20 73 74 61 74 65 27 73  20 63 61 6c 6c 65 64 20  | state's called |

Observe a seqüência de caracteres 0d 0a . Estes são os "terminadores de linha CR" referenciados na saída dos comandos file . Você pode usar uma ferramenta como dos2unix para removê-las.

$ dos2unix -n b.srt c.srt
dos2unix: converting file b.srt to file c.srt in UNIX format ...

Agora, quando analisamos o arquivo resultante para dos2unix , c.srt .

$ hexdump -C c.srt | head -5
00000000  31 0a 30 30 3a 30 30 3a  31 36 2c 33 30 32 20 2d  |1.00:00:16,302 -|
00000010  2d 3e 20 30 30 3a 30 30  3a 31 39 2c 36 38 30 0a  |-> 00:00:19,680.|
00000020  3c 69 3e 54 68 65 20 63  69 74 79 27 73 20 63 61  |<i>The city's ca|
00000030  6c 6c 65 64 20 44 75 6b  65 0a 54 68 65 20 73 74  |lled Duke.The st|
00000040  61 74 65 27 73 20 63 61  6c 6c 65 64 20 4e 65 77  |ate's called New|

Observe que a sequência 0d 0a do arquivo b.srt foi convertida em 0a . Esse caractere é como o final das linhas é finalizado nos sistemas Unix.

Agora, quando verificarmos o arquivo c.srt usando file , observe que o arquivo não é mais relatado como terminado com terminadores de linha CRLF.

$ file c.srt 
c.srt: UTF-8 Unicode English text

E os terminadores de linha CR?

Como @ resposta do TomH é um arquivo que termina usando apenas um CR, é de um Mac. Para deixar claro o ponto.

CR e LF são caracteres, respectivamente codificados 0x0D (13 decimal) e 0x0A (10 decimal). Eles são usados para marcar uma quebra de linha em arquivos de texto.

  • O Windows usa dois caracteres, por exemplo, CR LF sequence
  • O Unix usa apenas LF
  • MacIntosh usou CR

Quando a Apple passou a usar o OSX (que é baseado no BSD), eles mudaram para o LF , dado que o BSD está enraizado no Unix.

Veja o tópico da Wikipédia Newlines, que tem uma seção sobre Representações , abrange todos os diferentes sistemas e seus correspondentes novos caracteres de linha.

Referências

por 08.01.2014 / 07:03