converter arquivo txt para csv seperated com abas

0

Sinto muito as pessoas que sou novo no Linux e, embora tenha analisado a lista de perguntas respondidas, não sei o suficiente para reconhecer se minha pergunta foi respondida. Ou se eu puder adaptar uma das respostas ao meu probleminha em particular.

Eu recebo um arquivo de texto de dados do meu chefe, que aprendeu a usar computadores de uma maneira; e ele não vai mudar. Os dados são quase um arquivo csv, exceto que os campos são todos separados por um caractere de espaço, em vez de um caractere de vírgula ou tabulação. E os campos de texto dos dados incluem espaços incorporados também.

Cada campo é um número ou é números e texto, todos os campos são de comprimentos variados e nenhum é off-set com aspas simples ou duplas. Os campos numéricos predominam e nenhum campo de texto é adjacente a qualquer outro campo de texto. Raramente é um número embutido em um campo de texto precedido ou seguido por um caractere [espaço].

Infelizmente, nem todos os caracteres [do espaço] podem ser substituídos. Em vez disso, porque, geralmente, as quebras de campo vêm na forma de [espaço] [0-9] ou [0-9] [espaço], é assim que eu determino se um caractere [espaço] deve ser convertido em [tab] personagem ou não. Se o caractere [espaço] estiver ao lado de um dígito, ele será convertido em um caractere [tab].

Portanto, usando a função Localizar / Substituir no Bloco de Notas para Windows, eu procuro uma combinação de dígito-espaço ou de espaço-dígito, convertendo esse caractere [espaço] em um caractere [tab]. Eu tenho que fazer isso dez vezes [0-9] [espaço] e depois mais dez vezes [espaço] [0-9].   Estou procurando um script para fazer isso automaticamente.

Aqui está um exemplo do arquivo que recebo. Ele contém quatro campos separados por caracteres [space] (primeira linha). Cada linha a seguir é um registro, então a segunda linha é o primeiro registro. Account é 2281 , Units é 19 , Description é Toshiba PX-1982GRSUB {e, finalmente, o campo Delta contém o 0 :

Account Units Description Delta  
2281 19 Toshiba PX-1982GRSUB 0  
9618 200 HP MX19942-228b -25  
19246 4 CompuCom HD300g Hard Drive 4

Então, o que estou procurando é um script que lerá o arquivo original, converterá os caracteres [space] que são separadores de campo em caracteres e os gravará em um novo arquivo. E eu quero a explicação - então eu não continuo fazendo as mesmas perguntas repetidas vezes.

    
por Bobby H. 21.01.2016 / 04:17

2 respostas

1

Uma pesquisa na web por "substituir espaço por vírgula" foi muito proveitosa. Isso não funcionou para você primeiro? Teria encontrado muitas respostas como isso :

tr ' ' ',' < input > output

ou para guias:

tr '\t' ',' < input > output

e

sed 's/\s\+/,/g' input > output

\s é a classe de espaço (como [: space:]) e deve substituir quaisquer execuções ( + (escape) = um ou mais do caractere precedente) de espaços ou tabulações ou novas linhas também. Este próximo substituiria apenas cada espaço ou tabulação por uma única vírgula (como rodar ambos acima de tr 's):

sed 's/[ \t]/,/g' input > output

E -i edita o arquivo no local (edita diretamente o arquivo) em sed

Aqui está um sed que corresponderá a um número de espaço ou um espaço numérico e substitua-os por uma vírgula, usando o comando / símbolo OR | escapado como \| abaixo:

sed 's/ [0-9]\|[0-9] /,/g'
    
por Xen2050 23.01.2016 / 01:56
0

Ok, você precisa substituir os dois primeiros e o último espaço de cada linha por vírgula. Você não pode simplesmente substituir cada espaço, porque o terceiro campo pode conter espaços em si. Você pode fazer isso com a substituição da expressão regular. Aqui está um script / comando sed, que funciona:

sed -re 's/^(\S*) (\S*) (.*) (\S+)\s*$/,,,/' in.txt > out.csv

Com o exemplo acima, isso retorna:

Account,Units,Description,Delta
2281,19,Toshiba PX-1982GRSUB,0
9618,200,HP MX19942-228b,-25
19246,4,CompuCom HD300g Hard Drive,4

Isso ainda é bastante frágil ao lidar com campos vazios e interrupções por completo, se colunas diferentes da terceira contiverem espaços. É muito fácil introduzir esses dados malformados se forem formatados manualmente, como feito pelo seu chefe. Você deve sugerir a ele que mude para um formato de tabela mais robusto (por exemplo, CSV & amp; Co. adequado) e editor (ferramentas comuns de planilha podem manipular o CSV muito bem e com flexibilidade, por exemplo, LibreOffice / OpenOffice Calc, Microsoft Excel e Google Docs).

    
por David Foerster 25.01.2016 / 13:26