パイプで区切られた非常に大きなファイル (> 1GB) があります。file.readlines を使用してファイルをクエリし、各行を分割し、インデックス リスト (インデックスの配列を提供します) に従って、分割された行から特定の要素を選択し、それをカスタム型クラス オブジェクトのディクショナリに返します。
現在、私はこれを持っています:
strIndexes = "1,3,5,7";
var selected = strIndexes.Split(',')
.Select(x => int.Parse(x))
.Select(index => File.readlines(myFile)
.Select(x => split('|')[index]).toArray();
ただし、このクエリはインデックスによって導かれるため、それほど効率的ではありません。上記の例で指定された 4 つのインデックスにそれぞれ対応する 4 つのベクトルを返します。
助けていただければ幸いです。
アップデート:
コメントありがとうございます。サンプルデータを追加しています。ファイル データは次のようになります。
Line1: aa|ab|de|gt|hj|de|fr|gt|hy // Header
Line2: sd|12|f4|tr|hj|df|ds|e3|12
Line3: 34|fd|3d|35|df|45|dq|32|dd
.
.
.
Line N 34|df|f3|df|33|s2|23|df|44
N = 数百万行。データ形式は例のためのものであり、各セルは異なる長さと構造の文字列を保持しています。
ここで、ユーザーは要求されたデータをヘッダー列名の形式で入力します。たとえば、ab、de、fr、hy とします。これを解析し、列 2、3、7、および 9 が必要であることを理解しました。ファイルを解析し、各エントリが辞書エントリであるオブジェクトを返します。これは、行内のデータを表し、キー (列データの 1 つ) とトークン化されたデータの文字列 [] である値を保持します。
したがって、この例では、データを列番号 7 で並べ替えたいので、最終的な辞書は次のようになります。
[ds]->[12,f4,12]
[dq]->[fd,3d,dd]
.
.
.
[23]->[df,f3,44]