Analizar un archivo TSV

Necesito analizar un archivo en formato TSV (valores separados por tabulaciones). Utilizo una expresión regular para desglosar el archivo en cada línea, pero no puedo encontrar uno satisfactorio para analizar cada línea. Por ahora he subido esto:

(?("[^"]+")+|[^\t]+) 

Pero no funciona si un elemento en la línea tiene más de 2 comillas dobles consecutivas.

Así es como se formatea el archivo: cada elemento está separado por una tabulación. Si un elemento contiene una pestaña, está encerrado entre comillas dobles. Si un elemento contiene una comilla doble, se duplica. Pero a veces un elemento contiene 4 comillas dobles concientes, y la expresión regular anterior divide el elemento en 2 diferentes.

Ejemplos:

item1ok “item” “2” “oK”

se analiza correctamente en 2 elementos: item1ok y el elemento “2” ok (después de recortar las comillas innecesarias), pero:

item1oK “item” “” “2oK”

se analiza en 3 elementos: item1ok , item y “2ok (después de recortar de nuevo).

¿Alguien tiene una idea de cómo hacer que la expresión regular se ajuste a este caso? ¿O hay otra solución para analizar TSV simplemente? (Estoy haciendo esto en C #).

Podrías usar el TextFieldParser . Técnicamente es un conjunto de VB, pero puede usarlo incluso en C # haciendo referencia al conjunto de Microsoft.VisualBasic.FileIO .

El ejemplo en el enlace anterior incluso muestra cómo se usa en un archivo separado por tabulaciones.

En lugar de intentar crear su propio analizador de archivos CSV / TSV (o usar String.Split), le recomiendo que consulte el ” Fast CSV Reader ” o la ” biblioteca de FileHelpers “.

Estoy usando el primero, y estoy muy contento con él (admite cualquier carácter separador, por ejemplo, coma, punto y coma, pestaña).

En lugar de usar RegEx, tal vez podrías probar el método String.Split Method (Char []) .

No sé C # pero esto debería hacer el truco (en python)

 txt = 'item1ok\t"item""2""oK"\titem1oK\t"item""""2oK"\tsomething else' regex = ''' (?: # definition of a field "((?:[^"]|"")*)" # either a double quoted field (allowing consecutive "") | # or ([^"]*) # any character except a double quote ) # end of field (?:$|\t) # each field followed by a tab (except the last one) ''' r = re.compile(regex, re.X) # now find each match, and replace "" by " and remove trailing \t # remove also the latest entry in the list (empty string) columns = [t[0].replace('""', '"') if t[0] != '' else t[1].strip() for t in r.findall(txt)][:-1] print columns # prints: ['item1ok', 'item"2"oK', 'item1oK', 'item""2oK', 'something else']