Frage

Ich muss aus einer Vielzahl verschiedener Textdateien lesen (ich habe einige durch Trennzeichen getrennte Dateien und einige Dateien mit fester Breite).Ich habe darüber nachgedacht, die Dateien Zeile für Zeile zu analysieren (langsam mit den Methoden vom Typ File.ReadLine) und die Datei mit dem ODBC-Texttreiber zu lesen (schneller), aber hat jemand andere (bessere) Vorschläge?Ich verwende .NET/C#.

War es hilfreich?

Lösung 3

Beantwortung meiner eigenen Frage:

Am Ende habe ich das Microsoft.VisualBasic.FileIO.TextFieldParser-Objekt verwendet, siehe:

http://msdn.microsoft.com/en-us/library/f68t4563.aspx

(Beispiel für die Umsetzung hier)

Dadurch kann ich mit CSV-Dateien umgehen, ohne mir Gedanken darüber machen zu müssen, ob Felder in Anführungszeichen stehen, Kommas, Escape-Anführungszeichen usw. enthalten.

Andere Tipps

Ich bin mir nicht sicher, ob Sie wirklich einen Text- und Excel-Dateiparser erstellen könnten, es sei denn, Sie meinen mit Excel-Datei eine durch Komma/Pipeline/Tabulator getrennte Datei, bei der es sich eigentlich nur um eine weitere Textdatei handelt.Um echte Excel-Dateien zu lesen, müssen Sie die MS Office-Bibliotheken verwenden.

Informationen zum Parsen von durch Trennzeichen getrennten Textdateien finden Sie hier FileHelpers – Open Source und sie haben es im Großen und Ganzen abgedeckt.Ich bin mir jedoch nicht sicher, ob es Ihren Geschwindigkeitsanforderungen entspricht.

Ignorieren des Excel-Teils (der Ihrer Meinung nach nicht wichtig ist):

Ich habe festgestellt, dass LINQ beim Parsen von TXT-Dateien (durch Pipes getrennt oder CSV) ziemlich nützlich ist.

z.B.Dies liest eine durch Pipes getrennte Datei, überspringt die Hader-Zeile und erstellt als Ergebnis ein IEnumerable:

var records = aus der Zeile in Datei.readAllLines (@"C: Blah.txt"). Überspringen (1) lass parts = line.split ('|') Teile auswählen;

Wenn die Dateien relativ klein sind, können Sie die verwenden Datei Klasse.Es gibt diese Methoden, die Ihnen helfen können:

  • ReadAllBytes
  • ReadAllLines
  • ReadAllText

Ihre Frage ist etwas vage.Ich gehe davon aus, dass die Textdateien strukturierte Daten enthalten und nicht nur zufällige Textzeilen.

Wenn Sie die Dateien selbst analysieren, verfügt .NET über eine Bibliotheksfunktion zum Einlesen aller Zeilen aus einer Textdatei in ein Array von Zeichenfolgen (File.ReadAllLines).Wenn Sie wissen, dass Ihre Dateien klein genug sind, um sie im Speicher aufzunehmen, können Sie diese Methode verwenden und mit einem regulären Ausdruck über das Array iterieren, um die Felder zu validieren und zu extrahieren.

Excel-Dateien sind ein anderes Ballspiel..XLS-Dateien sind Binärdateien und keine Textdateien, daher müssten Sie eine Bibliothek eines Drittanbieters verwenden, um darauf zuzugreifen..XLSX-Dateien aus Excel 2007 enthalten komprimierte XML-Daten, daher müssten Sie das XML erneut dekomprimieren und dann einen XML-Parser verwenden, um an die Daten zu gelangen.Ich würde nicht empfehlen, einen eigenen XML-Parser zu schreiben, es sei denn, Sie verspüren das Bedürfnis nach einer intellektuellen Übung.

Ich stimme John zu,

Zum Beispiel:-

using System.IO;

...

public class Program {
  public static void Main() {
    foreach(string s in File.ReadAllLines(@"c:\foo\bar\something.txt") {
      // Do something with each line...
    }
  }
}

Der Dateilesevorgang ist nicht langsam, wenn Sie alle Dateien auf einmal mit der File-Klasse und den von John vorgeschlagenen Methoden lesen.Je nachdem, wie groß die Datei ist und was Sie damit machen möchten, benötigt sie möglicherweise mehr oder weniger Speicher.Ich würde vorschlagen, dass Sie es mit File.ReadAllText versuchen (oder was auch immer für Sie geeignet ist).

Zum Lesen von XLS-Dateien:

Wenn Sie über Microsoft Office XP und höher verfügen, haben Sie Zugriff auf die bereits enthaltenen .NET SDK Office-Bibliotheken, in denen Sie XLS-Dateien, Word, PPT usw. „nativ“ lesen können.Bitte beachten Sie, dass Sie dies unter Office XP während der Installation manuell überprüfen müssen (es sei denn, Sie hatten .NET zuvor installiert).

Ich weiß nicht, ob diese Bibliotheken als separates Paket verfügbar sind, wenn Sie nicht über Microsoft Office verfügen.

Aus irgendeinem unbekannten Grund sind alle diese Bibliotheken (einschließlich der neuesten Versionen von Office 2007 – auch bekannt als:Office 12) sind COM-Komponenten, die a Schmerz zu verwenden, verursachen hässliche Abhängigkeiten und sind nicht abwärtskompatibel.D.h.:Wenn Sie über einige Methoden verfügen, die mit Office XP (Office11) funktionieren, und diese auf einem Kunden mit Office 12 installieren, ist dies der Fall funktioniert nicht, da einige Schnittstellen geändert wurden.Sie müssen also aufrechterhalten zwei Reihe von „Bibliotheken“ und Methoden, um damit umzugehen.Das Gleiche gilt, wenn Sie Office 12-Bibliotheken zum Programmieren verwenden und Ihr Kunde über Office 11 verfügt.Ihre Bibliotheken funktionieren nicht.:S

Ich weiß nicht, warum Microsoft nie eine verwaltete Microsoft.Office.XXXX-Bibliothek (Wrapper) für diese hässlichen Dinge erstellt hat.

Wie auch immer, Ihre Frage ist ziemlich seltsam. Versuchen Sie, einige Ratschläge hier zu befolgen.Viel Glück!

Der ODBC-Texttreiber ist mittlerweile ziemlich veraltet – er bietet keine Unicode-Unterstützung.

Erstaunlicherweise verwendet MS Excel es immer noch, also wenn Sie offen Wenn Sie eine Unicode-CSV-Datei in Excel 2007 erstellen (anstatt sie zu importieren), gehen alle Nicht-ASCII-Zeichen verloren.

Am besten verwenden Sie die Dateilesemethoden von .Net, wie andere vorgeschlagen haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top