2017-08-07 21 views
-3

非常に大きなサイズのCSVファイルのデータを解析してソートする必要があります。ファイルは実際には600K行程度の大きさであることに注意してください。私はそれをどこに保存するか、DBにインポートする必要はありません。この実装を効率的に行う方法を教えてください。私はあなたの共有経験に感謝します。私はこのようにそれを行うだろうCSVファイルを読む?

+0

なぜ中央値が必要な場合はソートする必要がありますか? – jdweng

+0

[RFC 4180](https://tools.ietf.org/html/rfc4180)を読んで、CSV全体の画像を取得してから、RFC 4180 –

+0

http://www.filehelpersに従ってCSVデータを処理するライブラリを検索してください.net/example/Sorting/SortBigFiles/ –

答えて

1

...

var list = new List<float>(10000); 
using (var fs = new StreamReader(new FileStream("file.csv", FileMode.Open, FileAccess.Read, FileShare.None, 8192, FileOptions.SequentialScan))) 
{ 
    var line = fs.ReadLine(); 
    var columns = line.Split(','); 
    list.Add(Convert.ToSingle(columns[5])); 
} 
// Sort the list and do your calculations... 

お知らせFileOptions.SequentialScan、またと遊ぶbufferSizeまた...前より良い結果を得るために(デフォルト値は4096または8192であるかどうかわかりません)一覧のサイズを変更しないようにリストサイズを割り当てます。

+0

ありがとう@マイケル、ただ1つの列を読むことはできますか?私は列を読むのが効果的でしょうか? – user576510

+1

@ user576510すべての列/列の内容の幅/長さが固定されている場合は、列の直前にファイルカーソルを配置し、内容を読み取り、nバイトを次の行の列にジャンプすることができます。しかし、通常のcsvファイルでは、データ列がどこで始まり、現在の行が終わったのかわからないので、可変長列と仮定して答えはノーです。 – Michael

+0

parse [this csv](http: /imgur.com/a/url59)。 –

1

外部ソートを使用して大きなファイルの並べ替えを処理する方法の1つです。それらをすぐに提供する数多くのCSVライブラリがあります。

Cinchoo ETLには、外部ソート機能を持つCSVReaderがあります。あなたはあなたの目的のためにそれを活用することができます

a。 CSVレコードを表すPOCOクラスを定義します。重要:クラスをシリアライズ可能として、外部ソートの対象としてマークします。

[Serializable] 
public class Customer 
{ 
    [ChoCSVRecordField(1)] 
    [Key] 
    public int Id { get; set; } 
    [ChoCSVRecordField(2)] 
    public string Street { get; set; } 
    [ChoCSVRecordField(4)] 
    public string City { get; set; } 
    [ChoCSVRecordField(6)] 
    public string Zip { get; set; } 
} 

b。列に対してソートする比較クラスを作成する(例:都市別ソート)

c。最後に、ChoCSVReaderを使用してCSVファイルを読み込みます。それらをソートするにはExternalSortingメソッドに渡してください。

foreach (var e in new ChoCSVReader<Customer>("Test.txt").WithDelimiter("\t").ExternalSort(new AddressCityComparer())) 
    Console.WriteLine(e.City); 

希望します。

関連する問題