Domanda

C'è un modo semplice per convertire una stringa in formato csv in un string[] o di un elenco?

Posso garantire che non ci sono virgole nei dati.

È stato utile?

Soluzione

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

(Di seguito, il commento non viene aggiunto da originale risposto) Si prega di tenere presente che questa risposta risolve il caso SPECIFICO in cui sono garantiti per essere virgole nei dati.

Altri suggerimenti

Stringa.Spalato dista solo non sta andando a tagliare, ma una Regex.Spalato maggio - Prova questo:

using System.Text.RegularExpressions;

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

Dove 'input' è il csv di linea.Questo consentirà di gestire citato delimitatori, e dovrebbe dare un array di stringhe che rappresentano ogni campo nella linea.

Se si desidera robusto CSV gestione, check-out FileHelpers

Provare:

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

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

Si può dare un'occhiata a utilizzando il sistema di Microsoft.VisualBasic assemblea con il

Microsoft.VisualBasic.FileIO.TextFieldParser

Gestisce il CSV (o qualsiasi delimitatore) con le virgolette.Io l'ho trovato molto pratico di recente.

Non c'è un modo semplice per fare questo bene, se si desidera conto quotate elementi con virgole, soprattutto se essi sono mescolati con i non citati campi.

È inoltre consigliabile convertire le linee di un dizionario, utilizzando come chiave il nome della colonna.

Il mio codice per fare questo è di diverse centinaia di linee.

Penso che ci sono alcuni esempi sul web, progetti open source, etc.

Prova questo;

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(',');

Ottenere un string[] di tutte le linee:

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

Poi il ciclo e dividere quelle linee (questo errore incline perché non controllare per le virgole in preventivo di campi delimitati):

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

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

Si noti che il metodo Split() prende un array di caratteri a spalato.

Alcuni file CSV hanno virgolette intorno a valori con una virgola.Quindi a volte si può dividere questa stringa letterale:","

Un file Csv con i campi tra virgolette, non è un file Csv.Molto di più le cose (Excel) uscita senza virgolette, piuttosto che con le virgolette quando si seleziona "Csv" in "salva con nome".

Se si desidera, è possibile utilizzare, gratuitamente, o impegnarsi a, ecco il mio che fa anche IDataReader/Record.Esso utilizza anche la DataTable per definire/convertire/applicare le colonne e DbNull.

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

Non faccio citazioni..di sicurezza.Ho appena gettato insieme un paio di giorni fa graffiare un prurito.

Dimenticato Il Punto E Virgola:Bel link.Grazie.cfeduke:Grazie per la segnalazione a Microsoft.VisualBasic.FileIO.TextFieldParser.Andando in CsvDataReader stasera.

http://github.com/claco/csvdatareader/ aggiornato utilizzando TextFieldParser suggerito da cfeduke.

Pochi oggetti di scena di distanza da esporre separatori/trimspaces/tipo di ig hai solo bisogno di codice per rubare.

Ero già suddivisione in schede, così questo ha fatto il trucco per me:

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());
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top