さまざまなテキスト ファイルから読み取る必要があります (区切りファイルと固定幅ファイルがいくつかあります)。ファイルを1行ずつ解析し(File.ReadLineタイプのメソッドを使用すると遅い)、ODBCテキストドライバーを使用してファイルを読み取る(より高速)ことを検討しましたが、他に(より良い)提案はありますか?.NET/C# を使用しています。
9 に答える
テキストと Excel のファイル パーサーを実際に実行できるかどうかはわかりません。Excel ファイルとは、実際には別のテキスト ファイルであるコンマ/パイプ/タブで区切られたファイルを意味する場合を除きます。実際の Excel ファイルを読み取るには、MS Office ライブラリを使用する必要があります。
区切りテキスト ファイルの解析については、オープン ソースのFileHelpersを調べることができます。ただし、速度要件に一致するかどうかはわかりません。
私自身の質問に答える:
最終的に Microsoft.VisualBasic.FileIO.TextFieldParser オブジェクトを使用しました。以下を参照してください。
http://msdn.microsoft.com/en-us/library/f68t4563.aspx
これにより、フィールドが引用符で囲まれている、コンマが含まれている、引用符がエスケープされているなどの対処方法を心配することなく、csv ファイルを処理できます。
Excelの部分を無視します(重要ではないと言います):
LINQ は、txt ファイル (パイプ区切りまたは csv) の解析にかなり役立つことがわかりました。
たとえば、これは、hader 行をスキップしてパイプ区切りのファイルを読み取り、結果として IEnumerable を作成します。
var records = File.ReadAllLines(@"c:\blah.txt").Skip(1) の行から = line.Split('|') 部分を選択します。
ファイルが比較的小さい場合は、Fileクラスを使用できます。それはあなたを助けるかもしれないこれらの方法を持っています:
- ReadAllBytes
- ReadAllLines
- ReadAllText
私はジョンに同意します、
例えば:-
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...
}
}
}
あなたの質問は少し漠然としています。テキスト ファイルには、ランダムなテキスト行だけでなく、構造化データが含まれていると思います。
自分でファイルを解析する場合、.NET には、テキスト ファイルからすべての行を文字列の配列 (File.ReadAllLines) に読み取るライブラリ関数があります。ファイルがメモリに保持するのに十分小さいことがわかっている場合は、このメソッドを使用して、正規表現を使用して配列を反復処理し、フィールドを検証して抽出することができます。
Excel ファイルは別の球技です。.XLS ファイルはテキストではなくバイナリであるため、サードパーティのライブラリを使用してアクセスする必要があります。Excel 2007 の .XLSX ファイルには圧縮された XML データが含まれているため、XML を解凍してから XML パーサーを使用してデータを取得する必要があります。知的訓練の必要性を感じない限り、独自の XML パーサーを作成することはお勧めしません。
XLSファイルの読み込みについて:
Microsoft Office XP 以降をお持ちの場合は、既に含まれている .NET SDK Office ライブラリにアクセスして、XLS ファイル、Word、PPT などを「ネイティブに」読み取ることができます。Office XP では、手動で確認する必要があることに注意してください。インストール中 (以前に .NET をインストールしていない場合)。
Microsoft Office を持っていない場合、これらのライブラリが個別のパッケージとして利用できるかどうかはわかりません。
なんらかの理由で、これらすべてのライブラリ (Office 2007 の最新バージョン (別名: Office 12) を含む) は、使いにくく、厄介な依存関係を引き起こし、下位互換性がないCOM コンポーネントです。IE: Office XP (Office11) で動作するメソッドがいくつかあり、それを Office 12 の顧客にインストールすると、一部のインターフェイスが変更されたため、動作しません。そのため、 2 つの「ライブラリ」セットとそれに対処するメソッドを維持する必要があります。Office 12 ライブラリを使用してプログラミングし、顧客が Office 11 を使用している場合も同様です。ライブラリが機能しません。:S
なぜ Microsoft が Microsoft.Office.XXXX マネージ ライブラリ (ラッパー) をこれらの醜いものに対して作成しなかったのか、私にはわかりません。
とにかく、あなたの質問は非常に奇妙です。ここでいくつかのアドバイスに従ってください。幸運を!
ODBC テキスト ドライバーはかなり時代遅れになりました。Unicode をサポートしていません。
驚くべきことに、MS Excel はまだそれを使用しているため、Unicode CSV を (インポートするのではなく) Excel 2007 で開くと、非 ASCII 文字がすべて失われます。
他の人が示唆しているように、.Netのファイル読み取り方法を使用するのが最善の策です。
File クラスと John によって提案されたメソッドを使用して一度にすべてのファイルを読み取る場合、ファイルの読み取りプロセスは遅くありません。ファイルのサイズとそのファイルで何をしたいかによって、メモリの使用量が増減する場合があります。File.ReadAllText (またはあなたに適したもの) を試してみることをお勧めします。