Domanda

Ho una semplice applicazione che si apre un file di testo delimitato da tabulazioni, e inserisce i dati in un database.

Sto usando questo lettore CSV per leggere i dati: http: // www .codeproject.com / KB / database / CsvReader.aspx

Ed è tutto lavorando bene!

Ora il mio cliente ha aggiunto un nuovo campo alla fine del file, che è "ClaimDescription", e in alcune di queste descrizioni di reclamo, i dati ha le citazioni in essa, ad esempio:

  

"SUMISEI Maru 2" - mare del Giappone

Questa sembra essere la causa di una delle grandi preoccupazioni per la mia app. Ottengo un'eccezione che assomiglia a questo:

  

Il CSV sembra essere danneggiato vicino a '1470' campo '26 alla posizione '181' record. dati grezzi attuale: ...

E in quel "dati grezzi", abbastanza sicuro il campo descrizione pretesa mostra i dati con le citazioni in esso.

Vorrei sapere se qualcuno ha mai avuto questo problema prima, e ho ottenuto intorno ad esso? Ovviamente posso chiedere al cliente di modificare i dati che originariamente inviare a me, ma questo è un processo automatizzato che usano per generare il file delimitato da tabulazioni; ed Preferisco utilizzare che come ultima risorsa.

stavo pensando che potrei forse aprire il file utilizzando un TextReader standard prima mano, sfuggire eventuali citazioni, scrivere il contenuto di nuovo in un nuovo file, quindi alimentare il file nel formato CSV Reader. E 'probabilmente la pena ricordare che la dimensione media dei file di questi file delimitati da tabulazioni è di circa 40MB.

Ogni aiuto è molto apprezzato!

Saluti, Sean

È stato utile?

Soluzione 7

A destra - dopo una notte tarda di redbull e graffiare la mia testa, alla fine ho trovato il problema, è stato virgole nel campo "Claim_Description". Non ha nemmeno pensare che perché stavo usando un file delimitato da tabulazioni, ma non appena ho fatto una ricerca e sostituire su tutti i virgole nel file ha funzionato assolutamente bene!

Il passo successivo è quello di trovare il modo di sostituire quelle virgole prima di elaborare.

Ancora una volta, grazie per tutti i suggerimenti.

Saluti, Sean

Altri suggerimenti

Controllare il commento sull'articolo CodeProject su citazioni:

http: //www.codeproject .com / Messaggi / 3382857 / Re-Preventivi-Inside-of-the-Field.aspx

È necessario specificare nel costruttore che si desidera un altro personaggio oltre a "da usare come citazioni.

Utilizzare i FileHelpers biblioteca, invece. E 'ampiamente utilizzato e farà fronte con i campi citati, o campi che contengono citazioni.

Recentemente ho risolto un problema simile, e anche se CSVReader funzionava correttamente su tutti, ma poche righe di mio file TSV, che ha risolto il mio problema, alla fine, è stata la fissazione di un customDelimiter nel costruttore di 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();
            }
        }
    }

Forse è possibile aprire il file con l'applicazione e sostituire ogni citazione con un altro personaggio e poi elaborarlo.

Ho fatto qualche ricerca, e c'è un RFC per i file CSV ( RFC 4180 ) , e che non esplicitamente proibisce quello che stanno facendo:

  

Ogni campo può o non può essere racchiuso tra virgolette (tuttavia   alcuni programmi, ad esempio Microsoft Excel, non utilizzare le virgolette doppie   affatto). Se i campi non sono racchiusi con doppie virgolette, poi   virgolette doppie non possono essere visualizzati all'interno dei campi.

Fondamentalmente, se vogliono farlo, hanno bisogno di racchiudere tutto quel campo tra virgolette, in questo modo:

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

Quindi, se si vuole si può buttare questo problema verso di loro e insistere che viene inviato un "vero" file di RFC 4180 CSV.

Dal momento che si ha accesso ai file di origine per quel lettore CSV, un'altra opzione potrebbe essere quella di modificarlo per gestire il tipo di stringhe tra virgolette che si sta alimentando.

Questo tipo di situazione è esattamente il motivo per cui è fondamentale avere accesso al codice sorgente per il vostro set di strumenti.

Se invece si desidera pre-elaborazione (hack) i file prima di feeing al tuo strumento, il metodo corretto sarebbe quello di cercare per i campi con una citazione non immediatamente davanti o dietro un separatore, e racchiudere tutto il suo campo in un'altra serie di citazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top