Starker Zugriff auf csv in scala?

8

Ich möchte auf CSV-Dateien in Scala stark typisiert zugreifen. Zum Beispiel, wenn ich jede Zeile des CSV lese, wird es automatisch analysiert und als Tupel mit den entsprechenden Typen dargestellt. Ich könnte die Typen vorher in einer Art Schema angeben, das an den Parser übergeben wird. Gibt es Bibliotheken, die dafür existieren? Wenn nicht, wie kann ich diese Funktionalität selbst implementieren?

    
mushroom 15.06.2013, 17:55
quelle

7 Antworten

12

Produkt-Sammlungen scheint Ihren Anforderungen gerecht zu werden:

%Vor%

Produkt-Sammlungen verwendet opencsv unter der Haube.

A CollSeq3 ist ein IndexedSeq[Product3[T1,T2,T3]] und auch ein Product3[Seq[T1],Seq[T2],Seq[T3]] mit etwas Zucker. Ich bin Autor von Produkt-Sammlungen .

Hier ist ein Link zu die io Seite des scaladoc

Product3 ist im Wesentlichen ein Tupel von Arity 3.

    
Mark Lister 17.06.2013, 13:45
quelle
2
___ qstnhdr ___ Starker Zugriff auf csv in scala? ___ answer17149093 ___

Produkt-Sammlungen scheint Ihren Anforderungen gerecht zu werden:

%Vor%

Produkt-Sammlungen verwendet opencsv unter der Haube.

A Iterator[Array[String]] ist ein Iterator.map und auch ein collect mit etwas Zucker. Ich bin Autor von Produkt-Sammlungen .

Hier ist ein Link zu die io Seite des scaladoc

Product3 ist im Wesentlichen ein Tupel von Arity 3.

    
___ answer23698344 ___

Ich habe einen stark typisierten CSV-Helfer für Scala erstellt, object-csv . Es ist kein vollwertiges Framework, aber es kann leicht angepasst werden. Damit kannst du das machen:

%Vor%

Wo Person ist Fallklasse, wie folgt definiert:

%Vor%

Lesen Sie mehr darüber in GitHub oder in meinem blog Beitrag darüber.

    
___ answer17129818 ___

Ich habe meine eigene Idee entwickelt, um das Endprodukt stark zu typisieren, mehr als die Lesephase selbst. Wie bereits erwähnt, könnte es besser als erste Stufe mit etwas wie Apache CSV gehandhabt werden, und Stufe 2 könnte das sein, was ich getan habe . Hier ist der Code, den Sie willkommen sind. Die Idee ist, den CSVReader [T] mit Typ T zu typisieren. Bei der Konstruktion müssen Sie dem Leser auch ein Factor-Objekt vom Typ [T] liefern. Die Idee dabei ist, dass die Klasse selbst (oder in meinem Beispiel ein Hilfsobjekt) das Konstruktionsdetail entscheidet und dieses somit vom eigentlichen Lesen entkoppelt. Sie könnten implizite Objekte verwenden, um den Helper herumzuführen, aber ich habe das hier noch nicht gemacht. Der einzige Nachteil ist, dass jede CSV-Zeile vom gleichen Klassentyp sein muss, aber Sie können dieses Konzept nach Bedarf erweitern.

%Vor%

Als nächstes das Beispiel Helper Factory und Beispiel "Main"

%Vor%

Beispiel-CSV (Registerkarte getrennt .. muss möglicherweise repariert werden, wenn Sie von einem Editor kopieren)

%Vor%

Und schließlich der Autor (beachten Sie die Factory-Methoden erfordern dies auch mit "Makerow"

%Vor%     
___ answer34374579 ___

Sie können kantan.csv verwenden, das genau zu diesem Zweck entwickelt wurde.

Stellen Sie sich vor, Sie haben folgende Eingabe:

%Vor%

Mit kantan.csv könnten Sie den folgenden Code schreiben, um es zu parsen:

%Vor%

Und Sie erhalten einen Iterator, bei dem jeder Eintrag vom Typ Array[String] ist. Beachten Sie das Bit, bei dem die letzte Spalte in Ihrer CSV-Datei mehrere Typen umfassen kann. Dies wird jedoch bequem mit Vector behandelt.

Dies geschieht auf eine absolut typsichere Art und Weise, ohne Reflektion, die zur Kompilierzeit überprüft wird.

Je nachdem, wie weit das Kaninchenloch reicht, gibt es auch ein formloses -Modul für die automatisierte Fallklasse und Sum-Typ-Ableitung, sowie Unterstützung für scalaz und Katzen Typen und Typklassen.

Vollständige Offenlegung: Ich bin der Autor von kantan.csv.

    
___ tag123scala ___ Scala ist eine universelle Programmiersprache, die hauptsächlich auf die Java Virtual Machine abzielt. Entwickelt, um gängige Programmiermuster in einer prägnanten, eleganten und typsicheren Weise auszudrücken, vereint es sowohl imperative als auch funktionale Programmierstile. Seine Hauptmerkmale sind: fortgeschrittenes statisches System mit Typinferenz; Funktionstypen; Muster-Matching; implizite Parameter und Konvertierungen; Überlastung des Bedieners; volle Interoperabilität mit Java; Nebenläufigkeit ___ answer17126468 ___

Wenn Sie die # und Typen von Feldern kennen, vielleicht so?:

%Vor%     
___ tag123csv ___ Comma-Separated Values ​​oder Character-Separated Values ​​(CSV) ist ein standardmäßiges "Flat File Database" -Format zum Speichern tabellarischer Daten im Klartext, das aus einer optionalen Kopfzeile besteht, in der die durch Kommas, Tabulatoren oder andere Felder abgegrenzten Tabellenfelder aufgeführt sind Trennzeichen, gefolgt von einer oder mehreren Zeilen (durch Zeilentrennung getrennt), die die Tabellensätze als getrennte Listen der Werte darstellen. Newlines und Trennzeichen können in (zitierten) Feldern erscheinen. ___ tag123tuples ___ Bei der Programmierung sind Tupel einfache * Produkttypen *, die geordnete Sammlungen von Typen darstellen. ___ tag123strongtyping ___ Ein Typisierungssystem, das Beschränkungen auferlegt, nach denen Operationen oder Methoden für ein Objekt basierend auf dem Typ aufgerufen werden können. ___ answer17126754 ___

Dies wird komplizierter gemacht, als es aufgrund der nichttrivialen Zitationsregeln für CSV der Fall sein sollte. Sie sollten wahrscheinlich mit einem vorhandenen CSV-Parser beginnen, z. OpenCSV oder eines der Projekte namens scala-csv. (Es gibt am wenigsten drei .)

Dann enden Sie mit einer Art Sammlung von Saiten. Wenn Sie keine umfangreichen CSV-Dateien schnell lesen müssen, können Sie einfach versuchen, jede Zeile in jeden Ihrer Typen zu zerlegen und den ersten zu verwenden, der keine Ausnahme auslöst. Zum Beispiel

%Vor%

Wenn Sie sie ziemlich schnell analysieren müssen und Sie nicht wissen, was da sein könnte, sollten Sie wahrscheinlich eine Art von Übereinstimmung (z. B. Regexes) für die einzelnen Elemente verwenden. So oder so, wenn eine Fehlermöglichkeit besteht, möchten Sie wahrscheinlich List oder Left oder so etwas wie Paketfehler verwenden.

    
___ qstntxt ___

Ich möchte auf CSV-Dateien in Scala stark typisiert zugreifen. Zum Beispiel, wenn ich jede Zeile des CSV lese, wird es automatisch analysiert und als Tupel mit den entsprechenden Typen dargestellt. Ich könnte die Typen vorher in einer Art Schema angeben, das an den Parser übergeben wird. Gibt es Bibliotheken, die dafür existieren? Wenn nicht, wie kann ich diese Funktionalität selbst implementieren?

    
___
huynhjl 15.06.2013 23:36
quelle
1

Dies wird komplizierter gemacht, als es aufgrund der nichttrivialen Zitationsregeln für CSV der Fall sein sollte. Sie sollten wahrscheinlich mit einem vorhandenen CSV-Parser beginnen, z. OpenCSV oder eines der Projekte namens scala-csv. (Es gibt am wenigsten drei .)

Dann enden Sie mit einer Art Sammlung von Saiten. Wenn Sie keine umfangreichen CSV-Dateien schnell lesen müssen, können Sie einfach versuchen, jede Zeile in jeden Ihrer Typen zu zerlegen und den ersten zu verwenden, der keine Ausnahme auslöst. Zum Beispiel

%Vor%

Wenn Sie sie ziemlich schnell analysieren müssen und Sie nicht wissen, was da sein könnte, sollten Sie wahrscheinlich eine Art von Übereinstimmung (z. B. Regexes) für die einzelnen Elemente verwenden. So oder so, wenn eine Fehlermöglichkeit besteht, möchten Sie wahrscheinlich Try oder Option oder so etwas wie Paketfehler verwenden.

    
Rex Kerr 15.06.2013 18:35
quelle
1

Ich habe einen stark typisierten CSV-Helfer für Scala erstellt, object-csv . Es ist kein vollwertiges Framework, aber es kann leicht angepasst werden. Damit kannst du das machen:

%Vor%

Wo Person ist Fallklasse, wie folgt definiert:

%Vor%

Lesen Sie mehr darüber in GitHub oder in meinem blog Beitrag darüber.

    
Doron Yaacoby 16.05.2014 14:51
quelle
0

Ich habe meine eigene Idee entwickelt, um das Endprodukt stark zu typisieren, mehr als die Lesephase selbst. Wie bereits erwähnt, könnte es besser als erste Stufe mit etwas wie Apache CSV gehandhabt werden, und Stufe 2 könnte das sein, was ich getan habe . Hier ist der Code, den Sie willkommen sind. Die Idee ist, den CSVReader [T] mit Typ T zu typisieren. Bei der Konstruktion müssen Sie dem Leser auch ein Factor-Objekt vom Typ [T] liefern. Die Idee dabei ist, dass die Klasse selbst (oder in meinem Beispiel ein Hilfsobjekt) das Konstruktionsdetail entscheidet und dieses somit vom eigentlichen Lesen entkoppelt. Sie könnten implizite Objekte verwenden, um den Helper herumzuführen, aber ich habe das hier noch nicht gemacht. Der einzige Nachteil ist, dass jede CSV-Zeile vom gleichen Klassentyp sein muss, aber Sie können dieses Konzept nach Bedarf erweitern.

%Vor%

Als nächstes das Beispiel Helper Factory und Beispiel "Main"

%Vor%

Beispiel-CSV (Registerkarte getrennt .. muss möglicherweise repariert werden, wenn Sie von einem Editor kopieren)

%Vor%

Und schließlich der Autor (beachten Sie die Factory-Methoden erfordern dies auch mit "Makerow"

%Vor%     
LaloInDublin 16.06.2013 03:07
quelle
0

Sie können kantan.csv verwenden, das genau zu diesem Zweck entwickelt wurde.

Stellen Sie sich vor, Sie haben folgende Eingabe:

%Vor%

Mit kantan.csv könnten Sie den folgenden Code schreiben, um es zu parsen:

%Vor%

Und Sie erhalten einen Iterator, bei dem jeder Eintrag vom Typ (Int, String, Either[Float, Boolean]) ist. Beachten Sie das Bit, bei dem die letzte Spalte in Ihrer CSV-Datei mehrere Typen umfassen kann. Dies wird jedoch bequem mit Either behandelt.

Dies geschieht auf eine absolut typsichere Art und Weise, ohne Reflektion, die zur Kompilierzeit überprüft wird.

Je nachdem, wie weit das Kaninchenloch reicht, gibt es auch ein formloses -Modul für die automatisierte Fallklasse und Sum-Typ-Ableitung, sowie Unterstützung für scalaz und Katzen Typen und Typklassen.

Vollständige Offenlegung: Ich bin der Autor von kantan.csv.

    
Nicolas Rinaudo 19.12.2015 19:35
quelle
-1

Wenn Sie die # und Typen von Feldern kennen, vielleicht so?:

%Vor%     
7zark7 15.06.2013 18:07
quelle

Tags und Links