Domanda

Sto analizzando una stringa delimitata, qualcosa nell'ordine di

a, b, c

Ma questo è un esempio molto semplice e l'analisi dei dati delimitati può diventare complessa;ad esempio

1,"Il tuo semplice algoritmo fallisce",Vero

farebbe saltare in pezzi la tua ingenua implementazione string.Split.C'è qualcosa che posso usare/rubare/copiare e incollare liberamente che offra una soluzione relativamente a prova di proiettile per l'analisi del testo delimitato?.NET, plox.

Aggiornamento: Ho deciso di andare con il TextFieldParser, che fa parte della pila di gadget di VB.NET nascosti in Microsoft.VisualBasic.DLL.

È stato utile?

Soluzione

Lo uso per leggere da un file

string filename = @textBox1.Text;
string[] fields;
string[] delimiter = new string[] {"|"};
using (Microsoft.VisualBasic.FileIO.TextFieldParser parser =
       new Microsoft.VisualBasic.FileIO.TextFieldParser(filename)) {
    parser.Delimiters = delimiter;
    parser.HasFieldsEnclosedInQuotes = false;

    while (!parser.EndOfData) {
        fields = parser.ReadFields();
        //Do what you need
    }
}

Sono sicuro che qualcuno qui può trasformarlo per analizzare una stringa che è in memoria.

Altri suggerimenti

Una libreria molto completa può essere trovata qui: FileHelper

Non sono a conoscenza di alcun framework, ma funziona una semplice macchina a stati:

  • Stato 1:Leggi ogni carattere finché non premi un " o un ,
    • In caso di ":Passare allo Stato 2
    • In caso di:Passare allo stato 3
    • In caso di fine file:Passare allo stato 4
  • Stato 2:Leggi ogni carattere finché non premi un "
    • In caso di ":Passare allo Stato 1
    • In caso di fine del file:Passa allo stato 4 o segnala un errore a causa di una stringa non terminata
  • Stato 3:Aggiungi il buffer corrente all'array di output, sposta il cursore in avanti dietro e torna allo Stato 1.
  • Stato 4:questo è lo stato finale, non fa altro che restituire l'array di output.

Ad esempio

var elements = new List<string>();
var current = new StringBuilder();
var p = 0;

while (p < internalLine.Length) {
    if (internalLine[p] == '"') {
        p++;

        while (internalLine[p] != '"') {
            current.Append(internalLine[p]);
            p++;
        }

        // Skip past last ',
        p += 2;
    }
    else {
        while ((p < internalLine.Length) && (internalLine[p] != ',')) {
            current.Append(internalLine[p]);
            p++;
        }

        // Skip past ,
        p++;
    }

    elements.Add(current.ToString());
    current.Length = 0;
}

Ci sono alcune buone risposte qui: Divide una stringa ignorando le sezioni tra virgolette

Potresti voler riformulare la tua domanda in qualcosa di più preciso (ad es. Quale frammento di codice o libreria posso utilizzare per analizzare i dati CSV in .NET?).

Per fare uno spudorato plug, sto lavorando da tempo ad una libreria che si chiama fotelo (Caricatore di testo formattato) che utilizzo per analizzare rapidamente grandi quantità di testo in base a delimitatore, posizione o espressione regolare.Per una stringa veloce è eccessivo, ma se lavori con log o grandi quantità, potrebbe essere proprio ciò di cui hai bisogno.Funziona su un modello di file di controllo simile a SQL*Loader (una specie di ispirazione dietro di esso).

Meglio tardi che mai (aggiungi alla completezza di SO):

http://www.codeproject.com/KB/database/CsvReader.aspx

Questa dannata regola.

GJ

Penso che un quadro generico dovrebbe specificare due cose:1.Quali sono i caratteri di delimitazione.2.In quale condizione questi caratteri non contano (ad esempio quando sono tra virgolette).

Penso che potrebbe essere meglio scrivere una logica personalizzata per ogni volta che devi fare qualcosa del genere.

Il modo più semplice è semplicemente dividere la stringa in un array di caratteri e cercare i determinanti della stringa e dividere il carattere.

Dovrebbe essere relativamente facile eseguire il test unitario.

Puoi racchiuderlo in un metodo di estensione simile al metodo .Spilt di base.

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