Pregunta

¿Existe una manera fácil de convertir una cadena del formato csv a una cadena [] o lista?

Puedo garantizar que no hay comas en los datos.

¿Fue útil?

Solución

string[] splitString = origString.Split(',');

(El siguiente comentario no fue agregado por el respondedor original) Tenga en cuenta que esta respuesta aborda el caso ESPECÍFICO en el que se garantiza que NO habrá comas en los datos.

Otros consejos

String.Split simplemente no va a ser suficiente, pero Regex.Split sí puede. Pruebe este:

using System.Text.RegularExpressions;

string[] line;
line = Regex.Split( input, ",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))");

Donde 'entrada' es la línea csv.Esto manejará los delimitadores entre comillas y debería devolverle una serie de cadenas que representan cada campo en la línea.

Si desea un manejo sólido de CSV, consulte Ayudantes de archivos

Intentar:

Regex rex = new Regex(",(?=([^\"]*\"[^\"]*\")*(?![^\"]*\"))");
string[] values = rex.Split( csvLine );

Fuente: http://weblogs.asp.net/prieck/archive/2004/01/16/59457.aspx

Puede echar un vistazo al uso del ensamblado Microsoft.VisualBasic con el

Microsoft.VisualBasic.FileIO.TextFieldParser

Maneja CSV (o cualquier delimitador) con comillas.Lo he encontrado bastante útil recientemente.

No existe una forma sencilla de hacerlo bien si desea tener en cuenta los elementos entrecomillados con comas incrustadas, especialmente si están mezclados con campos no entrecomillados.

Probablemente también desee convertir las líneas en un diccionario, codificado por el nombre de la columna.

Mi código para hacer esto tiene varios cientos de líneas.

Creo que hay algunos ejemplos en la web, proyectos de código abierto, etc.

Prueba esto;

static IEnumerable<string> CsvParse(string input)
{
    // null strings return a one-element enumeration containing null.
    if (input == null)
    {
        yield return null;
        yield break;
    }

    // we will 'eat' bits of the string until it's gone.
    String remaining = input;
    while (remaining.Length > 0)
    {

        if (remaining.StartsWith("\"")) // deal with quotes
        {
            remaining = remaining.Substring(1); // pass over the initial quote.

            // find the end quote.
            int endQuotePosition = remaining.IndexOf("\"");
            switch (endQuotePosition)
            {
                case -1:
                    // unclosed quote.
                    throw new ArgumentOutOfRangeException("Unclosed quote");
                case 0:
                    // the empty quote
                    yield return "";
                    remaining = remaining.Substring(2);
                    break;
                default:
                    string quote = remaining.Substring(0, endQuotePosition).Trim();
                    remaining = remaining.Substring(endQuotePosition + 1);
                    yield return quote;
                    break;
            }
        }
        else // deal with commas
        {
            int nextComma = remaining.IndexOf(",");
            switch (nextComma)
            {
                case -1:
                    // no more commas -- read to end
                    yield return remaining.Trim();
                    yield break;

                case 0:
                    // the empty cell
                    yield return "";
                    remaining = remaining.Substring(1);
                    break;

                default:
                    // get everything until next comma
                    string cell = remaining.Substring(0, nextComma).Trim();
                    remaining = remaining.Substring(nextComma + 1);
                    yield return cell;
                    break;
            }
        }
    }

}
CsvString.split(',');

Obtenga una cadena [] de todas las líneas:

string[] lines = System.IO.File.ReadAllLines("yourfile.csv");

Luego recorra y divida esas líneas (esto es propenso a errores porque no busca comas en los campos delimitados por comillas):

foreach (string line in lines)
{
    string[] items = line.Split({','}};
}
string s = "1,2,3,4,5";

string myStrings[] = s.Split({','}};

Tenga en cuenta que Split() toma un formación de personajes para dividir.

Algunos archivos CSV tienen comillas dobles alrededor de los valores junto con una coma.Por lo tanto, a veces puedes dividir en esta cadena literal:","

Un archivo Csv con campos entre comillas no es un archivo Csv.Muchas más cosas (Excel) se generan sin comillas en lugar de con comillas cuando selecciona "Csv" al guardar como.

Si desea uno que pueda usar, liberar o comprometerse, aquí está el mío que también funciona con IDataReader/Record.También utiliza DataTable para definir/convertir/hacer cumplir columnas y DbNull.

http://github.com/claco/csvdatareader/

No hace comillas..todavía.Lo preparé hace unos días para aliviar la picazón.

Punto y coma olvidado:Buen enlace.Gracias.cfeduke:Gracias por el consejo a Microsoft.VisualBasic.FileIO.TextFieldParser.Entrando en CsvDataReader esta noche.

http://github.com/claco/csvdatareader/ actualizado usando TextFieldParser sugerido por cfeduke.

A solo unos pocos accesorios de exponer separadores/espacios de recorte/tipo ig, solo necesita código para robar.

Ya estaba dividiendo en pestañas, así que esto me funcionó:

public static string CsvToTabDelimited(string line) {
    var ret = new StringBuilder(line.Length);
    bool inQuotes = false;
    for (int idx = 0; idx < line.Length; idx++) {
        if (line[idx] == '"') {
            inQuotes = !inQuotes;
        } else {
            if (line[idx] == ',') {
                ret.Append(inQuotes ? ',' : '\t');
            } else {
                ret.Append(line[idx]);
            }
        }
    }
    return ret.ToString();
}
string test = "one,two,three";
string[] okNow = test.Split(',');
separationChar[] = {';'}; // or '\t' ',' etc.
var strArray = strCSV.Split(separationChar);
string[] splitStrings = myCsv.Split(",".ToCharArray());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top