it-swarm.com.de

Umgang mit Kommas in einer CSV-Datei

Ich suche nach Vorschlägen zum Umgang mit einer CSV-Datei, die erstellt und dann von unseren Kunden hochgeladen wird und die ein Komma in einem Wert enthalten kann, wie z.

Einige der Ideen, die wir betrachten, sind: Angeführte Bezeichner (Wert "," Werte "," usw.) oder die Verwendung eines | anstelle eines Kommas Das größte Problem ist, dass wir es einfach machen müssen, oder der Kunde macht es nicht. 

432
Bob The Janitor

Wie andere bereits gesagt haben, müssen Sie Werte mit Anführungszeichen schützen. Hier ist ein kleiner CSV-Leser in C♯, der zitierte Werte unterstützt, einschließlich eingebetteter Anführungszeichen und Wagenrücklauf.

Im Übrigen handelt es sich um einen von der Einheit getesteten Code. Ich poste es jetzt, da diese Frage sehr oft zu klappen scheint und andere möglicherweise keine ganze Bibliothek wünschen, wenn die einfache CSV-Unterstützung dies tut.

Sie können es wie folgt verwenden:

using System;
public class test
{
    public static void Main()
    {
        using ( CsvReader reader = new CsvReader( "data.csv" ) )
        {
            foreach( string[] values in reader.RowEnumerator )
            {
                Console.WriteLine( "Row {0} has {1} values.", reader.RowIndex, values.Length );
            }
        }
        Console.ReadLine();
    }
}

Hier sind die Klassen. Beachten Sie, dass Sie die Funktion Csv.Escape verwenden können, um auch gültige CSV zu schreiben.

using System.IO;
using System.Text.RegularExpressions;

public sealed class CsvReader : System.IDisposable
{
    public CsvReader( string fileName ) : this( new FileStream( fileName, FileMode.Open, FileAccess.Read ) )
    {
    }

    public CsvReader( Stream stream )
    {
        __reader = new StreamReader( stream );
    }

    public System.Collections.IEnumerable RowEnumerator
    {
        get {
            if ( null == __reader )
                throw new System.ApplicationException( "I can't start reading without CSV input." );

            __rowno = 0;
            string sLine;
            string sNextLine;

            while ( null != ( sLine = __reader.ReadLine() ) )
            {
                while ( rexRunOnLine.IsMatch( sLine ) && null != ( sNextLine = __reader.ReadLine() ) )
                    sLine += "\n" + sNextLine;

                __rowno++;
                string[] values = rexCsvSplitter.Split( sLine );

                for ( int i = 0; i < values.Length; i++ )
                    values[i] = Csv.Unescape( values[i] );

                yield return values;
            }

            __reader.Close();
        }
    }

    public long RowIndex { get { return __rowno; } }

    public void Dispose()
    {
        if ( null != __reader ) __reader.Dispose();
    }

    //============================================


    private long __rowno = 0;
    private TextReader __reader;
    private static Regex rexCsvSplitter = new Regex( @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))" );
    private static Regex rexRunOnLine = new Regex( @"^[^""]*(?:""[^""]*""[^""]*)*""[^""]*$" );
}

public static class Csv
{
    public static string Escape( string s )
    {
        if ( s.Contains( QUOTE ) )
            s = s.Replace( QUOTE, ESCAPED_QUOTE );

        if ( s.IndexOfAny( CHARACTERS_THAT_MUST_BE_QUOTED ) > -1 )
            s = QUOTE + s + QUOTE;

        return s;
    }

    public static string Unescape( string s )
    {
        if ( s.StartsWith( QUOTE ) && s.EndsWith( QUOTE ) )
        {
            s = s.Substring( 1, s.Length - 2 );

            if ( s.Contains( ESCAPED_QUOTE ) )
                s = s.Replace( ESCAPED_QUOTE, QUOTE );
        }

        return s;
    }


    private const string QUOTE = "\"";
    private const string ESCAPED_QUOTE = "\"\"";
    private static char[] CHARACTERS_THAT_MUST_BE_QUOTED = { ',', '"', '\n' };
}
212
harpo

Für 2017 ist csv vollständig spezifiziert - RFC 4180.

Diese Spezifikation ist sehr verbreitet und wird von vielen Bibliotheken ( example ) vollständig abgedeckt.

Verwenden Sie einfach eine leicht verfügbare csv-Bibliothek - also RFC 4180.


Es gibt tatsächlich eine Spezifikation für das CSV-Format und den Umgang mit Kommas: 

Felder mit Zeilenumbrüchen (CRLF), doppelten Anführungszeichen und Kommas sollten in doppelte Anführungszeichen eingeschlossen werden.

http://tools.ietf.org/html/rfc4180

Um Werte foo und bar,baz zu erhalten, müssen Sie Folgendes tun:

foo,"bar,baz"

Eine weitere wichtige Anforderung (auch aus der Spezifikation):

Wenn doppelte Anführungszeichen verwendet werden, um Felder einzuschließen, dann ein doppeltes Anführungszeichen Wenn Sie in einem Feld erscheinen, müssen Sie es mit .__ voranstellen. ein weiteres doppeltes Zitat. Zum Beispiel:

"aaa","b""bb","ccc"
375
Corey Trager

Das CSV-Format verwendet Kommas zum Trennen von Werten. Werte, die Zeilenumbrüche, Zeilenvorschübe, Kommas oder Anführungszeichen enthalten, sind in doppelte Anführungszeichen gesetzt. Werte, die doppelte Anführungszeichen enthalten, werden in Anführungszeichen gesetzt, und für jedes wörtliche Anführungszeichen wird ein unmittelbar vorangestelltes Anführungszeichen verwendet. Beispiel: Die 3 Werte:

test
list, of, items
"go" he said

wäre verschlüsselt als:

test
"list, of, items"
"""go"" he said"

Jedes Feld kann in Anführungszeichen gesetzt werden, aber nur Felder, die Kommas, CR/NL oder Anführungszeichen must enthalten.

Es gibt keinen echten Standard für das CSV-Format, aber fast alle Anwendungen folgen den Konventionen hier . Der an anderer Stelle erwähnte RFC ist kein Standard für CSV. Er ist ein RFC für die Verwendung von CSV innerhalb von MIME und enthält einige unkonventionelle und unnötige Einschränkungen, die ihn außerhalb von MIME unbrauchbar machen.

Die Tatsache, dass viele CSV-Module, die ich nicht gesehen habe, nicht berücksichtigt werden kann, ist die Tatsache, dass mehrere Zeilen in einem einzigen Feld codiert werden können. Das bedeutet, dass Sie nicht davon ausgehen können, dass jede Zeile ein separater Datensatz ist Daten bereit sein oder darauf vorbereitet sein.

71
Robert Gamble

Setzen Sie Anführungszeichen in doppelte Anführungszeichen. Das ist im Allgemeinen was Excel macht .

Ala Eli,

sie entgehen einem doppelten Anführungszeichen als zwei Anführungszeichen. Z.B. "test1", "foo" "bar", "test2"

38
Joe Phillips

Sie können die Felder in doppelte Anführungszeichen setzen. Ich mag diesen Ansatz nicht, da er ein weiteres Sonderzeichen hinzufügt (das doppelte Anführungszeichen). Definieren Sie einfach ein Escape-Zeichen (normalerweise ein Backslash) und verwenden Sie es, wo immer Sie etwas entziehen müssen:

daten, mehr Daten, mehr Daten, noch mehr

Sie müssen nicht versuchen, Anführungszeichen zu finden, und Sie haben weniger Ausnahmen zum Analysieren. Dies vereinfacht auch Ihren Code.

8
Adam Jaskiewicz

Über nuget steht eine Bibliothek zur Verfügung, die sich mit so ziemlich jeder gut gebildeten CSV (.net) - CsvHelper befassen kann.

Beispiel für eine Zuordnung zu einer Klasse:

var csv = new CsvReader( textReader );
var records = csv.GetRecords<MyClass>();

Beispiel zum Lesen einzelner Felder:

var csv = new CsvReader( textReader );
while( csv.Read() )
{
    var intField = csv.GetField<int>( 0 );
    var stringField = csv.GetField<string>( 1 );
    var boolField = csv.GetField<bool>( "HeaderName" );
}

Lässt den Client das Dateiformat steuern:
, ist das Standardfeldtrennzeichen, " ist der Standardwert, mit dem Felder mit einem Trennzeichen, einem Anführungszeichen oder einem Zeilenende gekennzeichnet werden.

So verwenden Sie beispielsweise # für Felder und ' für das Escaping:

var csv = new CsvReader( textReader );
csv.Configuration.Delimiter = "#";
csv.Configuration.Quote = ''';
// read the file however meets your needs

Weitere Dokumentation

6
NikolaiDante

Wie in meinem Kommentar zu Harpos Antwort erwähnt, ist seine Lösung gut und funktioniert in den meisten Fällen. In einigen Szenarien, in denen Kommas direkt nebeneinander stehen, kann sie jedoch nicht in Kommas aufgeteilt werden.

Dies liegt daran, dass sich die Regex-Zeichenfolge unerwartet als Vertabim-Zeichenfolge verhält. Um dieses Verhalten zu korrigieren, müssen alle "Zeichen in der Regex-Zeichenfolge manuell ohne Verwendung der Vertabim-Escape-Zeichenfolge maskiert werden.

Dh Der reguläre Ausdruck sollte folgendermaßen aussehen:

",(?=(?:[^\"\"]*\"\"[^\"\"]*\"\")*(?![^\"\"]*\"\"))"

was übersetzt in ",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))"

Wenn Sie eine vertabim-Zeichenfolge @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))" verwenden, verhält sich diese wie folgt, da Sie sehen können, ob Sie den regulären Ausdruck debuggen:

",(?=(?:[^"]*"[^"]*")*(?![^"]*"))"

Zusammenfassend empfehle ich Harpos Lösung, aber achten Sie auf dieses kleine Problem!

Ich habe in den CsvReader ein kleines optionales fehlersicheres Element aufgenommen, um Sie zu benachrichtigen, wenn dieser Fehler auftritt (wenn Sie eine vorher bekannte Anzahl von Spalten haben):

if (_expectedDataLength > 0 && values.Length != _expectedDataLength) 
throw new DataLengthException(string.Format("Expected {0} columns when splitting csv, got {1}", _expectedDataLength, values.Length));

Dies kann über den Konstruktor injiziert werden:

public CsvReader(string fileName, int expectedDataLength = 0) : this(new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
    _expectedDataLength = expectedDataLength;
}
5
MikeDub

Falls Sie sich in einem * nix-System befinden, haben Sie Zugriff auf sed, und es können nur ein oder mehrere unerwünschte Kommas in einem spezifischen Feld vorhanden sein. Ihrer CSV können Sie den folgenden Einzeiler verwenden, um sie in " als RFC4180 Abschnitt 2 einzuschließen:

sed -r 's/([^,]*,[^,]*,[^,]*,)(.*)(,.*,.*)/\1"\2"\3/' inputfile

Abhängig davon, in welchem ​​Feld sich die unerwünschten Kommas befinden, müssen Sie die Erfassungsgruppen des Regex (und die Substitution) ändern/erweitern.
.__ Das obige Beispiel wird das vierte (von sechs) Feld in Anführungszeichen einschließen.

enter image description here

In Verbindung mit der --in-place- Option können Sie diese Änderungen direkt auf die Datei anwenden.

Um die richtige Regex zu "bauen", gilt ein einfaches Prinzip: 

  1. Für jedes Feld in Ihrer CSV, das vor das Feld mit den unerwünschten Kommas kommt, schreiben Sie ein [^,]*, und fassen sie alle in einer Erfassungsgruppe zusammen.
  2. Für das Feld, das die unerwünschten Kommas enthält, schreiben Sie (.*).
  3. Für jedes Feld nach das Feld mit den unerwünschten Kommas schreiben Sie einen ,.* und fassen alle in einer Erfassungsgruppe zusammen.

Hier ist eine kurze Übersicht über verschiedene mögliche Ausdrücke/Substitutionen, abhängig vom jeweiligen Feld. Wenn nicht angegeben, lautet die Ersetzung \1"\2"\3.

([^,]*)(,.*)                     #first field, regex
"\1"\2                           #first field, substitution

(.*,)([^,]*)                     #last field, regex
\1"\2"                           #last field, substitution


([^,]*,)(.*)(,.*,.*,.*)          #second field (out of five fields)
([^,]*,[^,]*,)(.*)(,.*)          #third field (out of four fields)
([^,]*,[^,]*,[^,]*,)(.*)(,.*,.*) #fourth field (out of six fields)

Wenn Sie die unerwünschten Kommas mit sed entfernen möchten, anstatt sie in Anführungszeichen zu setzen, beziehen Sie sich auf diese Antwort .

3
Basti M

Fügen Sie einen Verweis auf Microsoft.VisualBasic hinzu (ja, es heißt zwar VisualBasic, funktioniert aber genauso gut in C # - denken Sie daran, dass es am Ende alles nur IL ist). 

Verwenden Sie die Klasse Microsoft.VisualBasic.FileIO.TextFieldParser zum Analysieren der CSV-Datei. Hier ist der Beispielcode:

 Dim parser As TextFieldParser = New TextFieldParser("C:\mar0112.csv")
 parser.TextFieldType = FieldType.Delimited
 parser.SetDelimiters(",")      

   While Not parser.EndOfData         
      'Processing row             
      Dim fields() As String = parser.ReadFields         
      For Each field As String In fields             
         'TODO: Process field                   

      Next      
      parser.Close()
   End While 
3
mvilaskumar

Sie können alternative "Trennzeichen" wie ";" oder "|" Am einfachsten ist es jedoch, nur Zitate zu verwenden, die von den meisten (anständigen) CSV-Bibliotheken und den meisten anständigen Kalkulationstabellen unterstützt werden.

Für mehr über CSV-Trennzeichen und eine Spezifikation für ein Standardformat zur Beschreibung von Trennzeichen und Zitaten siehe diese Webseite .

3
Rufus Pollock

In Europa haben wir dieses Problem früher als diese Frage. In Europa verwenden wir alle Kommas als Dezimalzeichen. Siehe diese Nummern unten:

| American      | Europe        |
| ------------- | ------------- |
| 0.5           | 0,5           |
| 3.14159265359 | 3,14159265359 |
| 17.54         | 17,54         |
| 175,186.15    | 175.186,15    |

Daher ist es nicht möglich, das Komma-Trennzeichen für CSV-Dateien zu verwenden. Aus diesem Grund sind die CSV-Dateien in Europa durch ein Semikolon (;) getrennt. 

Programme wie Microsoft Excel können Dateien mit einem Semikolon lesen und es ist möglich, vom Trennzeichen zu wechseln. Sie können sogar einen Tabulator (\t) als Trennzeichen verwenden. Siehe diese Antwort von Supper User .

2
H. Pauwelyn

Wenn Sie das Rad neu erfinden möchten, kann Folgendes für Sie funktionieren:

public static IEnumerable<string> SplitCSV(string line)
{
    var s = new StringBuilder();
    bool escaped = false, inQuotes = false;
    foreach (char c in line)
    {
        if (c == ',' && !inQuotes)
        {
            yield return s.ToString();
            s.Clear();
        }
        else if (c == '\\' && !escaped)
        {
            escaped = true;
        }
        else if (c == '"' && !escaped)
        {
            inQuotes = !inQuotes;
        }
        else
        {
            escaped = false;
            s.Append(c);
        }
    }
    yield return s.ToString();
}
2
Neil

Wenn Sie an einer eher informativen Übung zur Analyse von Dateien im Allgemeinen interessiert sind (am Beispiel von CSV), können Sie diesen Artikel von Julian Bucknall auschecken. Ich mag den Artikel, weil er die Dinge in viel kleinere Probleme aufteilt, die weniger unüberwindbar sind. Sie erstellen zunächst eine Grammatik. Sobald Sie eine gute Grammatik haben, ist es ein relativ einfacher und methodischer Prozess, die Grammatik in Code umzuwandeln.

Der Artikel verwendet C # und hat unten einen Link, um den Code herunterzuladen.

1
Phil

In der Regel kodiere ich die Felder, die Kommas oder Sonderzeichen enthalten können, durch eine URL-Kodierung. Und dann decodieren Sie es, wenn es in einem beliebigen visuellen Medium verwendet/angezeigt wird.

(Kommas werden zu% 2C)

Jede Sprache sollte über Methoden zum URL-Kodieren und Dekodieren von Zeichenfolgen verfügen.

beispielsweise in Java

URLEncoder.encode(myString,"UTF-8"); //to encode
URLDecoder.decode(myEncodedstring, "UTF-8"); //to decode

Ich weiß, dass dies eine sehr allgemeine Lösung ist und möglicherweise nicht ideal für Situationen ist, in denen der Benutzer den Inhalt der CSV-Datei manuell anzeigen möchte.

0
hariszhr

Da es sich um allgemeine Praktiken handelt, beginnen wir mit den Daumenregeln:

  1. Verwenden Sie keine CSV-Dateien, sondern verwenden Sie XML mit einer Bibliothek, um stattdessen die XML-Datei zu lesen und zu schreiben.

  2. Wenn Sie CSV verwenden müssen. Machen Sie es richtig und verwenden Sie eine kostenlose Bibliothek, um die CSV-Dateien zu analysieren und zu speichern.

Um 1) zu rechtfertigen, sind die meisten CSV-Parser nicht codierungsbewusst. Wenn Sie sich also nicht mit US-ASCII beschäftigen, fragen Sie nach Problemen .. _ Zum Beispiel speichert Excel 2002 die CSV-Datei in lokaler Codierung ohne Hinweis auf die Codierung . Der CSV-Standard ist nicht weit verbreitet: (. Auf der anderen Seite ist der XML-Standard gut angenommen und verarbeitet Kodierungen ziemlich gut.

Um es zu rechtfertigen, gibt es für fast alle Sprachen eine Unmenge an CSV-Parsern, sodass das Rad nicht neu erfunden werden muss, auch wenn die Lösung recht einfach aussieht.

Um nur einige zu nennen:

  • für Python verwenden Sie das Modul csv

  • für Perl prüfen CPAN und Text :: CSV

  • für PHP verwenden Sie die Funktionen fgetcsv/fputcsv

  • für die Java-Check SuperCVS -Bibliothek

Es ist wirklich nicht nötig, dies von Hand zu implementieren, wenn Sie es nicht auf eingebetteten Geräten analysieren.

0
Piotr Czapla

Die einfachste Lösung, die ich gefunden habe, ist die, die LibreOffice verwendet:

  1. Ersetzen Sie das gesamte Literal " durch
  2. Setzen Sie doppelte Anführungszeichen um Ihre Zeichenfolge

Sie können auch den von Excel verwendeten verwenden:

  1. Ersetzen Sie das gesamte Literal " durch ""
  2. Setzen Sie doppelte Anführungszeichen um Ihre Zeichenfolge

Beachten Sie, dass andere Personen empfohlen wurden, nur den obigen Schritt 2 auszuführen. Dies funktioniert jedoch nicht bei Zeilen, in denen auf " ein , folgt, wie in einer CSV, in der Sie eine einzelne Spalte mit der Zeichenfolge hello",world haben möchten, da die CSV lesen würde :

"hello",world"

Was als eine Zeile mit zwei Spalten interpretiert wird: hello und world"

0
MondKin
    public static IEnumerable<string> LineSplitter(this string line, char 
         separator, char skip = '"')
    {
        var fieldStart = 0;
        for (var i = 0; i < line.Length; i++)
        {
            if (line[i] == separator)
            {
                yield return line.Substring(fieldStart, i - fieldStart);
                fieldStart = i + 1;
            }
            else if (i == line.Length - 1)
            {
                yield return line.Substring(fieldStart, i - fieldStart + 1);
                fieldStart = i + 1;
            }

            if (line[i] == '"')
                for (i++; i < line.Length && line[i] != skip; i++) { }
        }

        if (line[line.Length - 1] == separator)
        {
            yield return string.Empty;
        }
    }
0
Rajat26

Sie können die CSV-Datei so lesen.

dies nutzt Splits und kümmert sich um Räume.

ArrayList List = new ArrayList();
static ServerSocket Server;
static Socket socket;
static ArrayList<Object> list = new ArrayList<Object>();


public static void ReadFromXcel() throws FileNotFoundException
{   
    File f = new File("Book.csv");
    Scanner in = new Scanner(f);
    int count  =0;
    String[] date;
    String[] name;
    String[] Temp = new String[10];
    String[] Temp2 = new String[10];
    String[] numbers;
    ArrayList<String[]> List = new ArrayList<String[]>();
    HashMap m = new HashMap();

         in.nextLine();
         date = in.nextLine().split(",");
         name = in.nextLine().split(",");
         numbers = in.nextLine().split(",");
         while(in.hasNext())
         {
             String[] one = in.nextLine().split(",");
             List.add(one);
         }
         int xount = 0;
         //Making sure the lines don't start with a blank
         for(int y = 0; y<= date.length-1; y++)
         {
             if(!date[y].equals(""))
             {   
                 Temp[xount] = date[y];
                 Temp2[xount] = name[y];
                 xount++;
             }
         }

         date = Temp;
         name =Temp2;
         int counter = 0;
         while(counter < List.size())
         {
             String[] list = List.get(counter);
             String sNo = list[0];
             String Surname = list[1];
             String Name = list[2];
             for(int x = 3; x < list.length; x++)
             {           
                 m.put(numbers[x], list[x]);
             }
            Object newOne = new newOne(sNo, Name, Surname, m, false);
             StudentList.add(s);
             System.out.println(s.sNo);
             counter++;
         }
0
Eric

Ich habe die papaParse-Bibliothek verwendet, um die CSV-Datei zu analysieren und die Schlüssel-Wert-Paare (Schlüssel/Header/erste Zeile des CSV-Datei-Werts) zu haben.

hier ist ein Beispiel, das ich benutze:

https://codesandbox.io/embed/llqmrp96pm

dort befindet sich die Datei dummy.csv, um die CSV-Parsing-Demo zu starten.

Ich habe es in reactJS verwendet, obwohl es leicht und einfach in einer App zu replizieren ist, die mit einer beliebigen Sprache geschrieben wurde.

0
parag patel

Ich habe die Csvreader-Bibliothek verwendet, aber damit habe ich Daten erhalten, indem ich das Komma (,) im Spaltenwert explodiere.

Wenn Sie CSV-Dateidaten einfügen möchten, die in den meisten Spaltenwerten ein Komma (,) enthalten, können Sie die Funktion ..__ verwenden. Autor link => https://Gist.github.com/jaywilliams/385876

function csv_to_array($filename='', $delimiter=',')
{
    if(!file_exists($filename) || !is_readable($filename))
        return FALSE;

    $header = NULL;
    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE)
    {
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
        {
            if(!$header)
                $header = $row;
            else
                $data[] = array_combine($header, $row);
        }
        fclose($handle);
    }
    return $data;
}
0
VirenPanchal

Zuerst fragen wir uns: "Warum empfinden wir die Notwendigkeit, Kommas für CSV-Dateien anders zu behandeln?"

Für mich lautet die Antwort: "Wenn ich Daten in eine CSV-Datei exportiere, verschwinden die Kommas in einem Feld und mein Feld wird in mehrere Felder getrennt, in denen die Kommas in den ursprünglichen Daten erscheinen." (Das liegt daran, dass das Komma das CSV-Feldtrennzeichen ist.)

Je nach Situation können auch Semikolons als CSV-Feldtrennzeichen verwendet werden.

Unter Berücksichtigung meiner Anforderungen kann ich ein Zeichen verwenden, z. B. ein einfaches Anführungszeichen (9), das wie ein Komma aussieht.

So kannst du es in Go machen:

// Replace special CSV characters with single low-9 quotation mark
func Scrub(a interface{}) string {
    s := fmt.Sprint(a)
    s = strings.Replace(s, ",", "‚", -1)
    s = strings.Replace(s, ";", "‚", -1)
    return s
}

Das zweite durch Kommas aussehende Zeichen in der Funktion Ersetzen ist dezimal 8218.

Beachten Sie, dass dieses decima 8218-Zeichen, wenn Sie über Clients verfügen, die über nur ASCII-Textleser verfügen, nicht wie ein Komma aussehen wird. Wenn dies der Fall ist, würde ich empfehlen, das Feld mit einem Komma (oder Semikolon) mit doppelten Anführungszeichen pro RFC 4128 zu umgeben: https://tools.ietf.org/html/rfc4180

0
l3x

Ich denke, die einfachste Lösung für dieses Problem besteht darin, dass der Kunde die CSV-Datei in Excel öffnet und dann mit Strg + R das gesamte Komma durch einen beliebigen Bezeichner ersetzt. Dies ist für den Kunden sehr einfach und erfordert nur eine Änderung in Ihrem Code, um das Trennzeichen Ihrer Wahl zu lesen.

0
jamesdeath123

Normalerweise mache ich dies in meinen CSV-Dateien zum Analysieren von Routinen. Angenommen, die 'Zeilen'-Variable ist eine Zeile innerhalb einer CSV-Datei und alle Werte der Spalten sind in doppelte Anführungszeichen gesetzt. Nachdem die beiden folgenden Zeilen ausgeführt wurden, erhalten Sie CSV-Spalten in der Auflistung "values".

// The below two lines will split the columns as well as trim the DBOULE QUOTES around values but NOT within them
    string trimmedLine = line.Trim(new char[] { '\"' });
    List<string> values = trimmedLine.Split(new string[] { "\",\"" }, StringSplitOptions.None).ToList();
0
user1451111