Pergunta

Eu tenho uma aplicação simples que abre um arquivo de texto delimitado por tabulações, e insere esses dados em um banco de dados.

Eu estou usando este leitor CSV para ler os dados: http: // www .codeproject.com / KB / database / CsvReader.aspx

E é tudo funcionando muito bem!

Agora meu cliente adicionou um novo campo para o final do arquivo, que é "ClaimDescription", e em algumas dessas descrições de reivindicação, os dados têm citações nele, exemplo:

"SUMISEI MARU NO 2" - mar do Japão

Este parece estar causando uma grande dor de cabeça para meu aplicativo. Eu recebo uma exceção que tem esta aparência:

O CSV parece estar corrompido perto record '1470' campo '26 na posição '181'. dados brutos atual: ...

E, em que "dados brutos", com certeza os dados mostram descrição reivindicação de campo com citações na mesma.

Eu quero saber se alguém já teve esse problema antes, e ficou em volta dele? Obviamente, eu posso pedir ao cliente para alterar os dados que originalmente enviar para mim, mas este é um processo automatizado que eles usam para gerar o arquivo delimitado por tabulação; e eu prefiro usar isso como um último recurso.

Eu estava pensando que talvez pudesse abrir o arquivo usando um TextReader padrão antes de lado, escapar qualquer aspas, escrever parte de trás conteúdo em um novo arquivo, em seguida, alimentar esse ficheiro para o CSV Reader. É provavelmente vale a pena mencionar que o tamanho médio de arquivo desses arquivos delimitados por tabulação é de cerca de 40MB.

Qualquer ajuda é muito apreciada!

Cheers, Sean

Foi útil?

Solução 7

Direito - depois de uma noite de redbull e coçar a cabeça, eu finalmente encontrado o problema, foi vírgulas no campo "Claim_Description". nem sequer pensar sobre isso porque eu estava usando um arquivo delimitado por tabulação, mas assim que eu fiz um localizar e substituir em todas as vírgulas no arquivo funcionou absolutamente bem!

O próximo passo é descobrir como substituir essas vírgulas antes de processar.

Mais uma vez, obrigado por todas as sugestões.

Cheers, Sean

Outras dicas

Verifique o comentário no artigo codeproject sobre citações:

http: //www.codeproject .com / Mensagens / 3382857 / re-Quotes-dentro-da-Field.aspx

Você precisa especificar no construtor que deseja outro personagem além "para ser usado como citações.

biblioteca

Use a FileHelpers . É amplamente utilizado e irá lidar com campos citados, ou campos que contêm aspas.

Recentemente, resolveu um problema semelhante, e embora CSVReader estava funcionando corretamente em todos, mas algumas linhas de meu arquivo TSV, o que resolveu o meu problema no final foi a criação de um customDelimiter no construtor de CsvReader

public static void ParseTSV(string filepath)
    {
        using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t')) {
        //if that didn't work, passing unlikely characters into the other params might help
        //using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t', '~', '`', '~', ValueTrimmingOptions.None)) {
            int fieldcount = csvReader.FieldCount;

            //Does not work, since it's read only property
            //csvReader.Delimiter = "\t";

            string[] headers = csvReader.GetFieldHeaders();

            while (csvReader.ReadNextRecord()) {
                for (int i = 0; i < fieldcount; i++) {
                    string msg = String.Format("{0}\r{1};", headers[i],
                                               csvReader[i]);
                    Console.Write(msg);
                }
                Console.WriteLine();
            }
        }
    }

Talvez você pode abrir o arquivo com sua aplicação e substituir cada citação com outro personagem e, em seguida, processá-lo.

Eu fiz alguma pesquisa, e há uma RFC para arquivos CSV ( RFC 4180 ) e que proíbe explicitamente o que estão fazendo:

Cada campo pode ou não ser colocada entre aspas duplas (no entanto, alguns programas, como o Microsoft Excel, não use aspas duplas em absoluto). Se campos não são colocados entre aspas, em seguida, aspas pode não aparecer dentro dos campos.

Basicamente, se eles querem fazer isso, eles precisam colocar esse campo inteiro entre aspas, assim:

,""SUMISEI MARU NO 2" - sea of Japan",

Então, se você quiser, pode jogar este problema de volta para eles e insistem que enviar-lhe um "bom" RFC 4180 arquivo CSV.

Uma vez que você tem acesso aos arquivos de origem para esse leitor CSV, outra opção seria a de modificá-lo para lidar com o tipo de cadeias entre aspas eles estão alimentando você.

Este tipo de situação é exatamente por isso que é vital para ter acesso ao código-fonte para o seu conjunto de ferramentas.

Se em vez você gostaria de pré-processamento (corte) de seus arquivos antes de feeing-los à sua ferramenta, o método correto seria a de olhar para os campos com uma citação não imediatamente em frente ou atrás de um separador, e coloque todo seu campo em outro conjunto de aspas.

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