CSV analyseur de fichiers de Texte avec TextFieldParser - MalformedLineException
Je suis en train de travailler sur un CSV de l'analyseur à l'aide de C# TextFieldParser classe.
Mes données au format CSV, est deliminated par ,
et la chaîne de caractères est délimitée par une "
caractère.
Cependant, parfois, la ligne de données de la cellule peut également avoir un "
qui semble être de faire de l'analyseur de lever une exception.
C'est mon code C# pour l'instant:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.VisualBasic.FileIO;
namespace CSV_Parser
{
class Program
{
static void Main(string[] args)
{
//Init
string CSV_File = "test.csv";
//Proceed If File Is Found
if (File.Exists(CSV_File))
{
//Test
Parse_CSV(CSV_File);
}
//Finished
Console.WriteLine("Press any to exit ...");
Console.ReadKey();
}
static void Parse_CSV(String Filename)
{
using (TextFieldParser parser = new TextFieldParser(Filename))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
parser.TrimWhiteSpace = true;
while (!parser.EndOfData)
{
string[] fieldRow = parser.ReadFields();
foreach (string fieldRowCell in fieldRow)
{
//todo
}
}
}
}
}
}
C'est le contenu de mon test.csv
fichier:
" dummy test"s data", b , c
d,e,f
gh,ij
Quelle est la meilleure façon de traiter avec "
dans ma cellule de la ligne de données?
Mise à JOUR
Basé sur Tim Schmelter's
réponse, j'ai modifié mon code comme suit:
static void Parse_CSV(String Filename)
{
using (TextFieldParser parser = new TextFieldParser(Filename))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
parser.HasFieldsEnclosedInQuotes = false;
parser.TrimWhiteSpace = true;
while (parser.PeekChars(1) != null)
{
var cleanFieldRowCells = parser.ReadFields().Select(
f => f.Trim(new[] { ' ', '"' }));
Console.WriteLine(String.Join(" | ", cleanFieldRowCells));
}
}
}
Qui semble produire les éléments suivants (correctement):
Est que c'est la meilleure façon de traiter avec chaîne de caractères délimitée par des guillemets, d'avoir un devis?
- prétraiter le fichier pour vérifier qu'il est bien formé.
- Avez-vous essayé avec msdn.microsoft.com/en-us/library/...
- Qu'advient-il si vous essayez de supprimer la citation de caractère. Donc, mettre
HasFieldsEnclosedInQuotes
àfalse
. - N'est-ce pas le drapeau indique simplement le parser la chaîne fermée à l'aide de guillemets? Je crois que c'est activé par défaut.
- Ce n'est pas vraiment endommagé. Nous nous attendons à des données de cette façon. E. g. une cellule pourrait avoir ces données:
"11" Wide"
et j'ai besoin d'être en mesure d'analyser ce... - il est divisé selon les spec (RFC 4180): >> Si les guillemets sont utilisés pour inclure les champs, puis un guillemet double apparaissant à l'intérieur d'un champ doit être échappé en le faisant précéder d'un autre guillemet double.
Vous devez vous connecter pour publier un commentaire.
Pourrait vous omettez le citant caractères en paramètre
HasFieldsEnclosedInQuotes
àfalse
?Vous pouvez supprimer les guillemets manuellement: