Split mit Trennzeichen außer als Trennzeichen entkommen
Bin ich beim Lesen von Daten der Zwischenablage aus excel mit
var stream = (System.IO.Stream) ( Forms.Clipboard.GetDataObject() ).GetData( Forms.DataFormats.CommaSeparatedValue );
,
aber leider, excel ist vorbei text der Zelle statt Zelle-Werte. Wenn die Zellen werden mit besonderer Formatierung (wie die Tausende seperator), die Daten in der Zwischenablage für eine Reihe von Zellen, die in Spalten, die wie folgt aussieht:
1,234,123.00 2,345.00 342.00 12,345.00
gespeichert ist, als diese:
\" 1,234,123.00 \",\" 2,345.00 \", 342.00 ,\" 12,345.00 \"
wenn das, was ich wirklich will, ist dieses:
1234123.00, 2345.00, 342.00, 12345.00
Hatte ich zuvor mit der clipData.Split(new string[] { "," }, StringSllitOptions.None))
- Funktion, um meine CSV-Daten aus der Zwischenablage in eine Reihe von Zellen, aber dieser schlägt fehl, wenn es entkam formatierten text mit Kommas.
Frage ich mich, wenn jeder denken kann ein Weg, um split-diesen string in eine Reihe von Zellen, ignoriert die Kommas escaped innerhalb der \"
bits, da diese wie Excel ist die Auswahl an Flucht-Zellen mit Kommas.
Kurz gesagt, wie kann ich aus einem string mit dieser:
\" 1,234,123.00 \",\" 2,345.00 \", 342.00 ,\" 12,345.00 \"
in ein array von strings mit diesem:
{ "1,234,123.00", "2,345.00", "342.00", "12,345.00" }
Ohne zu ruinieren, meine Fähigkeit zu analysieren, eine einfache Komma getrennte Zeichenfolge.
******* edit*
Follow-up-Frage (formuliert als ein DFA) hier: Aufteilen einer Zeichenfolge basiert auf jeder Zeit einen Deterministischen Endlichen Automaten erreicht einen Endzustand?
- Sind Sie tatsächlich sehen, ein \ gefolgt von einem " oder sind Sie nur mit\", um anzuzeigen, dass ein doppeltes Anführungszeichen anstelle einer Bezeichnung für den Beginn einer Zeichenkette.
- Bekommst du nicht die Daten in ein anderes format? Verwenden Sie IDataObject.GetFormats zum abrufen einer Liste der verfügbaren Formate und sehen, wenn Sie eine finden, die besser funktioniert.
- Okay ich nehme meine Zeit zu bewerten und zu testen mehrere dieser Lösungen und erhalten zurück zu Euch.
- Viele Lösungen scheitern aufgrund der Tatsache, dass excel nicht immer in Anführungszeichen gesetzt werden die Zellwerte nur dann, wenn Sie die ein Komma enthalten. Jedem Fall mit "split", die dodge versehentlich Spaltung Kommas innerhalb von Anführungszeichen nicht korrekt Spaltung auf, Kommas als Anführungszeichen werden nicht verwendet.
Du musst angemeldet sein, um einen Kommentar abzugeben.
First off ich habe, befasste sich mit Daten aus Excel vor und das, was Sie normalerweise sehen, ist durch Kommas getrennte Werte, und wenn der Wert als string wird es, doppelte Anführungszeichen um ihn herum (und können enthalten Kommas und doppelte Anführungszeichen). Wenn man betrachtet, ist es numerisch sein, dann gibt es keine doppelten Anführungszeichen. Außerdem, wenn die Daten enthält, ein doppeltes Anführungszeichen, die werden getrennt durch doppelte Anführungszeichen wie
""
. Vorausgesetzt, alle, die hier, wie ich behandelt haben dies in der VergangenheitNatürlich dieser übernimmt die Daten kommen gilt also, wenn Sie so etwas wie
"fo,o"b,ar","bar""foo"
wird dies nicht funktionieren. Außerdem, wenn Ihre Daten enthält"
dann wird es sich in ein " was kann oder kann nicht wünschenswert sein.Es gibt eine Menge von Möglichkeiten, dies zu tun. Man unelegant Weise, die funktionieren würde, ist:
Nun haben Sie was Sie wollten in den ersten Platz
\"1,234\",123,\"2,345\"
."
aber nicht trennen möchten, auf\"
so ersetzte ich alle\"
mit etwas verrückt, dass würde nie da sein, und dann teilen Sie es von"
und ersetzt die verrückte Sachen mit\"
nach dem split. Hat Super geklappt!Stimme ich mit Kyle bezüglich Ihrer string-wohl nicht konsequent.
Anstelle von Kyle erste Schritt, den Sie nutzen könnten,
Ihrer Eingangs-Beispiel können wir sehen, dass es drei "unerwünschten" Sequenzen von Zeichen:
So, fügen Sie alle diese Sequenzen, um das input-array für die
Split
Methode:Dadurch erhalten Sie ein array mit ein paar leeren Elemente. Wenn das ein problem ist, verwenden
StringSplitOptions.RemoveEmptyEntries
stattStringSplitOptions.None
:123 , 456 , 789
als Excel stellt nur die doppelten Anführungszeichen um Daten, die als string (in diesem Fall, wenn die Daten, die ein Komma enthält). In diesem Fall ist deine Lösung nicht funktionieren würde.Könnten Sie versuchen, verwenden Sie ein wenig LINQ:
Alternativ, wenn Sie nicht wie dieser Vorschlag, versuchen zu implementieren, die ein ähnliches Muster mit RegEx.