回答編集履歴

3

期待通りの動作をしなかった (すみません) ので誤りを訂正します

2024/02/26 09:30

投稿

ikedas
ikedas

スコア4365

test CHANGED
@@ -1,3 +1,5 @@
1
+ **2024-02-26 訂正あり**
2
+ ___
1
3
  Import-CSVコマンドレットでCSVファイル全部を読み込んで処理しようとすると、メモリ不足になって失敗するということですね。
2
4
 
3
5
  であれば、CSVファイルを少しずつ読み込んで処理できる方法を考えなければなりません。理想は一度に1レコード (1行) しか読み込まないことです。
@@ -21,11 +23,15 @@
21
23
  “差之 寸世蔵”,”2001-03-11”,”9862200”,...
22
24
  “耶 由代”,”2023-04-25”,”0850245”,...
23
25
  ```
24
- ``` psh
26
+ ``` ps1
25
- sort X-key.csv Y-key.csv > XY.csv
27
+ sort.exe XY-key.csv > XY.csv
26
28
  ```
27
29
 
30
+ なお、XY-key.csvは上のX-key.csv、Y-key.csv、…の内容を連結したものです。連結の順番は問いませんし、ファイルの数も自由です。
31
+
28
32
  sortコマンドはメモリ不足にならないのか心配でしょうか。sortコマンドはすべてのレコードを一度にメモリ上でソートできない場合、データを小部分に分けてソートした結果を一時的にディスクに保存しその後マージすることで、メモリ不足を起こさずにすべてのレコードがソートされた結果を出力します (詳しくは[sortコマンドの文書](https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/sort)を参照)。
33
+
34
+ ※拡張子なしのsortを実行するとsortコマンドの代わりにSort-Content コマンドレットが実行されてしまうので、sort.exeとして実行する必要があります。
29
35
 
30
36
  さて、ソートの結果できるファイルはこんなふうになります (名前のソート結果が実際とはちがうかもしれませんが、例ということで)。
31
37
  XY.csv

2

微修正

2024/02/15 14:11

投稿

ikedas
ikedas

スコア4365

test CHANGED
@@ -10,13 +10,13 @@
10
10
  sortコマンドでは特定のフィールドでソートすることはできませんから工夫が必要ですね。たとえばキーフィールドをレコードの先頭に持ってくれば、キーでソートできます。
11
11
 
12
12
  X-key.csv
13
- ``` code
13
+ ```
14
14
  “差之 寸世蔵”,”2001-03-11”,”9862200”,...
15
15
  “阿以 宇江雄”,”1970-01-01”,”5010634”,...
16
16
  “加幾 久計子”,”1989-11-09”,”0850245”,...
17
17
  ```
18
18
  Y-key.csv
19
- ``` code
19
+ ```
20
20
  “ラリー ルレロ”,”2011-09-01”,”5010634”,...
21
21
  “差之 寸世蔵”,”2001-03-11”,”9862200”,...
22
22
  “耶 由代”,”2023-04-25”,”0850245”,...
@@ -25,11 +25,11 @@
25
25
  sort X-key.csv Y-key.csv > XY.csv
26
26
  ```
27
27
 
28
- sortコマンドはメモリ不足にならないのか心配でしょうか。sortコマンドはすべてのレコードを一度にメモリ上でソートできない場合、データを小部分に分けてソートした結果を一時的にディスクに保存しその後マージすることでメモリ不足を起こさずにすべてのレコードがソートされた結果を出力します (詳しくは[sortコマンドの文書](https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/sort)を参照)。
28
+ sortコマンドはメモリ不足にならないのか心配でしょうか。sortコマンドはすべてのレコードを一度にメモリ上でソートできない場合、データを小部分に分けてソートした結果を一時的にディスクに保存しその後マージすることでメモリ不足を起こさずにすべてのレコードがソートされた結果を出力します (詳しくは[sortコマンドの文書](https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/sort)を参照)。
29
29
 
30
30
  さて、ソートの結果できるファイルはこんなふうになります (名前のソート結果が実際とはちがうかもしれませんが、例ということで)。
31
31
  XY.csv
32
- ``` code
32
+ ```
33
33
  “ラリー ルレロ”,”2011-09-01”,”5010634”,...
34
34
  “阿以 宇江雄”,”1970-01-01”,”5010634”,...
35
35
  “加幾 久計子”,”1989-11-09”,”0850245”,...
@@ -41,6 +41,7 @@
41
41
 
42
42
  実際のコードは考えてみてください。
43
43
 
44
+ ___
44
45
  なお、上記の方式ではメモリの使用量は抑えられますが、処理中に一時的に使用されるディスクの空き容量を考慮しなければなりません。
45
46
  * キーフィールドがレコードの最初にくるCSVファイル。元のCSVファイルと同じ大きさです。
46
47
  * sortコマンドが作成する一時ファイル。ソート対象のCSVファイルの総量と同じくらいで、多くても2倍を超えることはないでしょう。

1

追記: ディスク使用量について

2024/02/15 13:48

投稿

ikedas
ikedas

スコア4365

test CHANGED
@@ -41,3 +41,9 @@
41
41
 
42
42
  実際のコードは考えてみてください。
43
43
 
44
+ なお、上記の方式ではメモリの使用量は抑えられますが、処理中に一時的に使用されるディスクの空き容量を考慮しなければなりません。
45
+ * キーフィールドがレコードの最初にくるCSVファイル。元のCSVファイルと同じ大きさです。
46
+ * sortコマンドが作成する一時ファイル。ソート対象のCSVファイルの総量と同じくらいで、多くても2倍を超えることはないでしょう。
47
+ * ソート結果のファイル。元のCSVファイルの総量と同じ大きさです。
48
+
49
+ これらのファイルは最終的な出力が得られれば必要なくなるため削除できますが、作業のためには元のCSVファイルの総量の3倍から4倍の空きディスク容量が必要だということになります。