0

同様に機能する機能を作成したいと思いますSqlDataReader.Read()

.txt/.csv からフラット ファイルを読み取り、ビジネス ロジックを処理するクラスにデータ テーブルとして返します。これはデータテーブルの行を反復処理し、データを変換して構造化データベースに書き込みます。この構造を複数のインポート ソースに使用します。

ただし、大きなファイルは、非常にゆっくりと動作します。30 MB のデータを処理するのに 2 時間かかっていますが、これを 30 分に短縮したいと考えています。この方向への 1 つのステップは、ファイル全体を DataTable に読み込むのではなく、1 行ずつ処理し、メモリがログに記録されないようにすることです。

次のようなものが理想的です: PSEUDOCODE。

FlatFileReader ffr = new FlatFileReader(); //Set FlatFileParameters
while(ffr.ReadRow(out DataTable parsedFlatFileRow))
{
     //...Business Logic for handling the parsedFlatFileRow
}

のように機能するメソッドを実装するにはどうすればよい.ReadRow(out DataTable parsedFlatFileRow)ですか?


これは正しい方向ですか?

foreach(obj in ff.lazyreading()){
    //Business Logic
} 

...

class FlatFileWrapper{

    public IEnumerable<obj> lazyreading(){
        while(FileReader.ReadLine()){ 
            yield return parsedFileLine; 
        }
    } 
}
4

2 に答える 2

1

Tim が既に述べたように、File.ReadLinesが必要です。

「ReadLines を使用すると、コレクション全体が返される前に、文字列のコレクションの列挙を開始できます」

このメソッドを使用するパーサーを次のように作成できます。

// object you want to create from the file lines.
public class Foo
{
    // add properties here....
}

// Parser only responsibility is create the objects.
public class FooParser
{
    public IEnumerable<Foo> ParseFile(string filename)
    {
        if(!File.Exists(filename))
            throw new FileNotFoundException("Could not find file to parse", filename);

        foreach(string line in File.ReadLines(filename))
        {
            Foo foo = CreateFoo(line);

            yield return foo;
        }
    }

    private Foo CreateFoo(string line)
    {
        // parse line/create instance of Foo here

        return new Foo {
            // ......
        };
    }
}

コードの使用:

var parser = new FooParser();

foreach (Foo foo in parser.ParseFile(filename))
{
     //...Business Logic for handling the parsedFlatFileRow
}
于 2013-10-30T10:37:36.893 に答える
0

File.ReadLines次のように動作する whichを使用できますStreamReader

foreach(string line in File.ReadLines(path))
{
     //...Business Logic for handling the parsedFlatFileRow
}
于 2013-10-30T09:43:45.240 に答える