Question

Existe-t-il un moyen simple de convertir une chaîne du format CSV en chaîne [] ou en liste?

Je peux vous garantir qu'il n'y a pas de virgule dans les données.

Était-ce utile?

La solution

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

(Le commentaire suivant n'a pas été ajouté par le répondant d'origine) N'oubliez pas que cette réponse concerne le cas spécifique où il n'y a aucune virgule dans les données.

Autres conseils

String.Split ne va tout simplement pas le couper, mais un Regex.Split peut - Essayez celui-ci:

using System.Text.RegularExpressions;

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

Où "input" est la ligne csv. Cela traitera les délimiteurs entre guillemets et devrait vous restituer un tableau de chaînes représentant chaque champ de la ligne.

Si vous souhaitez une gestion robuste des fichiers CSV, consultez FileHelpers

.

Essayez:

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

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

Vous pouvez utiliser l'assembly Microsoft.VisualBasic avec

.
Microsoft.VisualBasic.FileIO.TextFieldParser

Il gère les fichiers CSV (ou tout délimiteur) avec des guillemets. Je l’ai trouvé assez pratique récemment.

Il n’existe pas de moyen simple de le faire correctement si vous souhaitez que les éléments cités avec des virgules incorporées soient pris en compte, en particulier s’ils sont mélangés à des champs non cités.

Vous voudrez probablement aussi convertir les lignes en dictionnaire, indexé par le nom de la colonne.

Mon code pour ce faire a plusieurs centaines de lignes.

Je pense qu'il existe des exemples sur le Web, des projets open source, etc.

Essayez ceci;

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

Obtenir une chaîne [] de toutes les lignes:

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

Ensuite, parcourez et divisez ces lignes (cette erreur est sujette au non-respect des virgules dans les champs délimités par des guillemets):

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

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

Notez que Split () prend un tableau de caractères sur lesquels scinder.

Certains fichiers CSV ont des guillemets doubles autour des valeurs avec une virgule. Par conséquent, vous pouvez parfois séparer ce littéral de chaîne: ", "

Un fichier Csv avec des champs cités n'est pas un fichier Csv. Beaucoup plus de choses (Excel) sont générées sans guillemets plutôt que entre guillemets lorsque vous sélectionnez " Csv " dans une sauvegarde sous.

Si vous en voulez un que vous pouvez utiliser, libérer ou s’engager à le faire, voici le mien qui fait également IDataReader / Record. Il utilise également DataTable pour définir / convertir / appliquer des colonnes et DbNull.

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

Il ne fait pas de guillemets .. pour le moment. Je viens de le jeter ensemble il y a quelques jours pour me gratter d'une démangeaison.

Point-virgule oublié: bon lien. Merci. cfeduke: Merci pour le conseil à Microsoft.VisualBasic.FileIO.TextFieldParser. Entrer dans CsvDataReader ce soir.

http://github.com/claco/csvdatareader/ mis à jour à l'aide de TextFieldParser proposé par cfeduke .

À quelques points d’exposition des séparateurs / espaces de séparation / type, il vous suffit de code pour voler.

J'étais déjà en train de scinder les onglets, donc ça a marché pour moi:

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());
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top