2008-09-16 26 views
6

Existe-t-il un moyen facile de convertir une chaîne du format csv en une chaîne [] ou une liste?asp.net Convertir une chaîne CSV en chaîne []

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

+1

Comment serait-il possible de decern de celle des virgules qui sont dans les données et virgules qui séparent les données? – mmattax

+0

Parce que cette question sera éventuellement indexée par Google pour ces mots-clés. Ce serait bien d'avoir une réponse plus complète vers le haut. –

+0

Je pense que si vous vouliez poser une question différente (ou la même avec plus de détails), vous auriez dû faire cela, au lieu de détourner celui-ci et de donner l'impression que les réponses à la question initiale du demandeur étaient fausses. – travis

Répondre

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

(Suite commentaire n'a pas ajouté par answerer d'origine) S'il vous plaît garder à l'esprit que cette réponse porte sur le cas particulier où il sont garantis sans virgules dans les données.

+0

Quelqu'un avec des privilèges d'édition s'il vous plaît fixer le code dans ce post. –

+0

Si vous parlez de vouloir .Split ({','}), en C# et .NET 2.0 ce n'est pas nécessaire. La surcharge .Split (..) que j'utilise prend un params char [], le compilateur le transforme en tableau. –

+0

Comment cela peut-il être la réponse ... puisque la question indique clairement que le fractionnement d'une virgule n'est pas assez bon? –

0
CsvString.split(','); 
+0

Et s'il y a des virgules dans les données? –

+0

puis String.split (","); et si les données contiennent des virgules avec espaces alors csv était un mauvais choix pour stocker et transmettre les données – cazlab

0

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

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

boucle ensuite à travers et diviser ces lignes (cette erreur sujette car il ne vérifie pas les virgules dans les champs délimités devis-):

foreach (string line in lines) 
{ 
    string[] items = line.Split({','}}; 
} 
+0

Je pense que nous sommes à la recherche d'une seule ligne, csv to value sets array – DevelopingChris

+0

Ajouté que ... Je pensais que la question était ambiguë. –

0
string test = "one,two,three"; 
string[] okNow = test.Split(','); 
0
string s = "1,2,3,4,5"; 

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

Notez que split() prend un tableau de caracté teurs à diviser.

+0

il prend un params char [], ce qui signifie que vous n'avez pas besoin de créer le tableau char, le compilateur le fera pour vous –

0
separationChar[] = {';'}; // or '\t' ',' etc. 
var strArray = strCSV.Split(separationChar); 
0
string[] splitStrings = myCsv.Split(",".ToCharArray()); 
8

Si vous voulez une manipulation CSV robuste, consultez FileHelpers

+0

FileHelpers est une excellente bibliothèque pour les enregistrements délimités et de longueur fixe. Consommer des fichiers CSV est un jeu d'enfant. –

1

Il n'y a pas un moyen simple de le faire bien, si vous voulez tenir compte des éléments cités par des virgules intégrées, surtout si ils sont mélangés avec des champs non-cités.

Vous voudrez probablement convertir les lignes dans un dictionnaire, avec le nom de la colonne.

Mon code pour ce faire est de plusieurs centaines de lignes.

Je pense qu'il ya quelques exemples sur le web, les projets open source, etc.

0

Certains fichiers CSV ont des guillemets doubles autour des valeurs le long avec une virgule. Par conséquent, vous pouvez parfois diviser sur cette chaîne littérale: ","

+0

Pour un exemple de ceci, si vous avez Excel, créez un nouveau document et entrez des données dans un champ avec des virgules. Enregistrer en tant que fichier CSV, puis ouvrez-le dans un éditeur de texte. Lumières pour mmattax. –

0

Un fichier Csv avec des champs Cotés, n'est pas un fichier Csv. Bien plus de choses (Excel) sortent sans guillemets plutôt qu'avec des guillemets lorsque vous sélectionnez "Csv" dans une sauvegarde sous.

Si vous en voulez un que vous pouvez utiliser, libérer ou valider, voici le mien qui fait aussi 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 .. encore. Je l'ai juste jeté ensemble il y a quelques jours pour gratter une démangeaison.

Mot de passe oublié: Nice link. Merci. cfeduke: Merci pour l'astuce à Microsoft.VisualBasic.FileIO.TextFieldParser. Aller dans CsvDataReader ce soir.

+2

"Un fichier CSV avec des champs entre guillemets n'est pas un fichier CSV."== false http://en.wikipedia.org/wiki/Comma-separated_values ​​ –

16

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

using System.Text.RegularExpressions; 

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

Où entrée 'est la ligne de csv. Cela gérera les délimiteurs entre guillemets, et devrait vous renvoyer un tableau de chaînes représentant chaque champ de la ligne.

+0

Pour les enregistrements, cette regex fonctionne très bien sur les données que j'utilise, qui a cité des données avec des virgules – BenB

+0

Cela ne fonctionne pas droit pour les données non-citées (si vous l'avez): par exemple il échoue sur ce qui suit: Chaîne s = "a, b, c"; – Goyuix

+0

cela fonctionnerait-il pour un fichier csv avec plusieurs lignes/enregistrements? – naz786

2

Vous pouvez jeter un oeil à l'aide de l'ensemble Microsoft.VisualBasic avec le

Microsoft.VisualBasic.FileIO.TextFieldParser 

Il gère CSV (ou tout delimiter) avec des guillemets. Je l'ai trouvé très pratique récemment.

1

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

} 
0

http://github.com/claco/csvdatareader/ mis à jour en utilisant TextFieldParser suggéré par cfeduke. Juste quelques accessoires loin d'exposer des séparateurs/trimspaces/type ig vous avez juste besoin de code pour voler.

0

Je partageais déjà sur les onglets, donc cela ne l'affaire 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(); 
}