Pergunta

Eu tenho arquivos CSV com o seguinte formato:

CSV FILE
"a"             , "b"     , "c" , "d"
hello, world    , 1       , 2   , 3
1,2,3,4,5,6,7   , 2       , 456 , 87
h,1231232,3     , 3       , 45  , 44

O problema é que o primeiro campo tem vírgulas "," nele. Não tenho controle sobre a geração de arquivos, pois esse é o formato em que os recebo. Existe uma maneira de ler um arquivo CSV para trás, desde o final da linha até o início?

Não me importo de escrever um pequeno script Python para fazê -lo, se for guiado na direção certa.

Foi útil?

Solução

o rsplit O método da string divide uma string a partir da direita, em vez da esquerda, e é provavelmente o que você está procurando (é preciso um argumento especificando o número máximo de vezes para dividir):

line = "hello, world    , 1       , 2   , 3"
parts = line.rsplit(",", 3)
print parts  # prints ['hello, world    ', ' 1       ', ' 2   ', ' 3']

Se você deseja retirar o espaço em branco desde o início e o final de cada item da sua lista dividida, você pode usar o strip Método com uma compreensão de lista

parts = [s.strip() for s in parts]
print parts  # prints ['hello, world', '1', '2', '3']

Outras dicas

Não entendo completamente por que você quer ler cada linha ao contrário, mas você pode fazer isso:

import csv
file = open("mycsvfile.csv")
reversedLines = [line[::-1] for line in file]
file.close()
reader = csv.reader(reversedLines)
for backwardRow in reader:
    lastField = backwardRow[0][::-1]
    secondField = backwardRow[1][::-1]

Inverta a string primeiro e depois processe -a.

tmp = tmp [::-1

A partir da amostra que você forneceu, parece que "colunas" são de tamanho fixo. Primeiro (aquele com vírgulas) tem 16 caracteres, então por que você não tenta ler a linha de arquivo por linha e, em seguida, para cada linha que lê os 16 primeiros caracteres (como um valor da primeira coluna) e o restante de acordo? Depois de ter cada valor, você pode analisá -lo ainda mais (aparar os espaços em branco e assim por diante ...).

Isso não é então um arquivo CSV, separado por vírgula, significa exatamente isso.

Como você pode ter certeza de que não é:

CSV FILE
"a"             , "b"     , "c" , "d"
hello           , world   , 1   , 2   , 3
1               , 2       , 3   , 4   , 5,6,7,2,456,87
h               , 1231232 , 3   , 3   , 45,44

Se o arquivo for como você indicar, o primeiro grupo deve estar cercado por cotações, parece que os nomes de campo são tão estranhos que os campos que contêm vírgulas não são.

Não sou fã de corrigir erros da fonte, eu volto para o gerador de dados para fornecer CSV adequado, se é isso que eles estão alegando que é.

Você sempre pode fazer algo com Regex, como (Perl Regex)

#!/usr/bin/perl

use IO::File;

if (my $file = new IO::File("test.csv"))
{
    foreach my $line (<$file>) {
    $line =~ m/^(.*),(.*?),(.*?),(.*?)$/;
    print "[$1][$2][$3][$4]\n";
    }
} else {
    print "Unable to open test.csv\n";
}

(O primeiro é uma pesquisa gananciosa, os três últimos não são)Editar: Publicado código completo em vez de apenas o regex

Se você sempre espera o mesmo número de colunas e apenas a primeira coluna pode conter vírgulas, basta ler qualquer coisa e concatenar o excesso de colunas no início.

O problema é que a interface é ambígua e você pode tentar contornar isso, mas a melhor solução é tentar consertar a interface (o que geralmente é mais difícil do que criar vários patches ...).

Eu concordo com o Sr. Beer. Esse é um arquivo CSV mal formado. Sua melhor aposta é encontrar outros delimitadores ou parar de sobrecarregar as vírgulas ou citar/escapar do campo que não separa vírgulas

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top