テスト用に数百万行の大きなCSVを読み込もうとしています。私はプロバイダを使用してCSVをデータベースとして扱うことができることを知っています。Microsoft.ACE.OLEDB.12.0Microsoft.ACE.OLEDB.12.0 OleDbConnectionを使用してCSVをカスタムオブジェクトに変換する
小さいデータセットを使用して、.GetValue(int)
を使用して行の内容を位置的に読み取ることができます。私はデータを読むことがより良いということを見いだすのに苦労しています(1つでもあると仮定します)。手前のカラム名を知っていれば、これは簡単です。しかし、私がそれらを知らなかったら、ファイルの最初の行を読んで、そのデータを愚かに見えるようにしなければならないでしょう。
@"
id,first_name,last_name,email,ip_address
1,Edward,Richards,[email protected],201.133.112.30
2,Jimmy,Scott,[email protected],103.231.149.144
3,Marilyn,Williams,[email protected],52.180.157.43
4,Frank,Morales,[email protected],218.175.165.205
5,Chris,Watson,[email protected],75.251.1.149
6,Albert,Ross,[email protected],89.56.133.54
7,Diane,Daniels,[email protected],197.156.129.45
8,Nancy,Carter,[email protected],75.162.65.142
9,John,Kennedy,[email protected],85.35.177.235
10,Bonnie,Bradley,[email protected],255.67.106.193
"@ | Set-Content .\test.csv
$conn = New-Object System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\Users\Matt';Extended Properties='Text;HDR=Yes;FMT=Delimited';")
$cmd=$conn.CreateCommand()
$cmd.CommandText="Select * from test.csv where first_name like '%n%'"
$conn.open()
$data = $cmd.ExecuteReader()
$data | ForEach-Object{
[pscustomobject]@{
id=$_.GetValue(0)
first_name=$_.GetValue(1)
last_name=$_.GetValue(2)
ip_address=$_.GetValue(4)
}
}
$cmd.Dispose()
$conn.Dispose()
$cmd.ExecuteReader()
の出力を処理するより良い方法はありますか? CSVインポートのための情報を得ることが難しい。 Webのほとんどは、SQLデータベースからこのプロバイダを使用してCSVにエクスポートすることを扱っています。ここでのロジックは大規模なCSVに適用されるので、大部分のデータを無視するだけで全体を読む必要はありません。