Pregunta

Estoy pensando en analizar una cadena delimitada, algo del orden de

a B C

Pero este es un ejemplo muy simple y el análisis de datos delimitados puede resultar complejo;por ejemplo

1,"Tu algoritmo simple falla",Verdadero

volaría su cadena ingenua. Implementación dividida en bits.¿Hay algo que pueda usar/robar/copiar y pegar libremente que ofrezca una solución relativamente a prueba de balas para analizar texto delimitado?.NET, plox.

Actualizar: Decidí ir con el Analizador de campos de texto, que es parte del montón de ventajas de VB.NET escondidas en Microsoft.VisualBasic.DLL.

¿Fue útil?

Solución

Lo uso para leer de un archivo.

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
    }
}

Estoy seguro de que alguien aquí puede transformar esto para analizar una cadena que está en la memoria.

Otros consejos

Puede encontrar una biblioteca muy completa aquí: Ayudantes de archivos

No conozco ningún marco, pero funciona una máquina de estados simple:

  • Estado 1:Lee cada carácter hasta que llegues a " o a ,
    • En caso de ":Mover al estado 2
    • En caso de:Mover al estado 3
    • En caso de fin de expediente:Pasar al estado 4
  • Estado 2:Lee cada carácter hasta que llegues a "
    • En caso de ":Mover al estado 1
    • En caso de finalización del expediente:Pasar al estado 4 o indicar un error debido a una cadena no terminada
  • Estado 3:Agregue el búfer actual a la matriz de salida, mueva el cursor hacia adelante detrás de y regrese al Estado 1.
  • Estado 4:este es el estado final, no hace nada excepto devolver la matriz de salida.

Como

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;
}

Hay algunas buenas respuestas aquí: Dividir una cadena ignorando las secciones entre comillas

Es posible que desee reformular su pregunta con algo más preciso (p. ej. ¿Qué fragmento de código o biblioteca puedo usar para analizar datos CSV en .NET??).

Para hacer un complemento descarado, llevo un tiempo trabajando en una biblioteca llamada fotelo (Cargador de texto formateado) que utilizo para analizar rápidamente grandes cantidades de texto en función del delimitador, la posición o la expresión regular.Para una cadena rápida es excesivo, pero si trabaja con registros o grandes cantidades, puede ser justo lo que necesita.Funciona con un modelo de archivo de control similar a SQL*Loader (una especie de inspiración detrás de esto).

Más vale tarde que nunca (añadir a la integridad de SO):

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

Éste manda.

G.J.

Estoy pensando que un marco genérico necesitaría especificar entre dos cosas:1.¿Cuáles son los caracteres delimitadores?2.¿En qué condiciones esos caracteres no cuentan (por ejemplo, cuando están entre comillas)?

Creo que sería mejor escribir una lógica personalizada para cada vez que necesites hacer algo como esto.

La forma más sencilla es simplemente dividir la cadena en una matriz de caracteres y buscar los determinantes de la cadena y dividir el carácter.

Debería ser relativamente fácil realizar pruebas unitarias.

Puede envolverlo en un método de extensión similar al método básico .Spilt.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top