ウィンドウスで、ユニコード(UTF16)のファイルがあります。

このファイルをソートしたいのですが、良い方法がありましたら教えてください。

※SORTコマンドではうまくできませんでした。

回答の条件
  • URL必須
  • 1人1回まで
  • 登録:
  • 終了:2008/10/25 16:32:53
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:ardarim No.3

回答回数897ベストアンサー獲得回数145

ポイント100pt

Windowsのコマンドプロンプトは、マルチバイト環境なのでリダイレクトでUnicodeファイルを出力することはどうやっても不可能です。

コンソールのリダイレクトを使わずに単体のプログラム内で完結したソートをする必要があります。


スクリプトで書いてみましたのでよろしければどうぞ。

適当なファイル名(例:sort.js)で保存して、コマンドプロンプトから

cscript sort.js 入力ファイル名 出力ファイル名

で実行してください。UTF-16の中国語テキストファイル(4MB)がソートできることは確認しました。


fso = WScript.CreateObject("Scripting.FileSystemObject");
wsh = WScript.CreateObject("Wscript.Shell");

if(WScript.arguments.length != 2){
	WScript.echo("入力ファイル、出力ファイルを指定してください");
	WScript.quit();
}

fileName = WScript.arguments.item(0);

try {
	txtFile = fso.openTextFile(fileName, 1, false, -1);
} catch(e){
	WScript.echo(e);
	WScript.echo("ファイルオープンエラー(" + fileName + ")");
	WScript.quit();
}

lines = new Array;

i = 0;
while(!txtFile.atEndOfStream){
	lines[i++] = String(txtFile.readLine());
}

txtFile.close();

lines.sort(function(a,b){ return a.localeCompare(b); });

txtFile = fso.createTextFile(WScript.arguments.item(1), true, true);
for(i = 0; i < lines.length; i++){
	txtFile.writeLine(lines[i]);
}
txtFile.close();

fso = null;
wsh = null;

WScript.quit();

URLはダミー

http://q.hatena.ne.jp/1224777958

id:Vacuum

おおお~すごいでつ。

4GBのファイルがソートできました。

メモリはつかいますけど・・・

これで、問題は解決できました。

2008/10/25 16:30:22

その他の回答2件)

id:zzz_1980 No.1

回答回数492ベストアンサー獲得回数64

ポイント10pt

まず sort が windows のものかどうか確認を。

そのうえで、

||>

sort -L C <input.txt >output.txt

||<

で余計なコード変換は止められます。

http://itpro.nikkeibp.co.jp/free/NT/WinKeyWord/20040805/1/sort.s...

id:Vacuum

C:\TEMP>SORT -L C <LUInit.ini >SORT.OUT

入力ファイルが 2 度指定されました。

????

2008/10/24 09:47:20
id:takerudayo No.2

回答回数165ベストアンサー獲得回数29

ポイント10pt

エラーの原因はパラメータの書き方です。

パラメータの 「 -L 」の部分を「 /L 」と書き換えてください。

SORTコマンドのパラメータは - ではなく / 表記になります。


また、私のところでは

WinXPSP3日本語版環境で

「SORT input.txt > output.txt」

と特別な事をしなくても正常に処理できました。

(ただしinput.txtがUnicodeファイルなのに対して、output.txtはSJISに変わってしまいます)

質問者さんがおっしゃっている「SORTコマンドではうまくできませんでした」はどのような事を

指していますでしょうか?


もしコマンドラインのSORTである必要がなければ、

GUIのフリーソフトを使われても実現が可能と思います。

http://www.vector.co.jp/vpack/filearea/win/util/text/sort/

id:Vacuum

>質問者さんがおっしゃっている「SORTコマンドではうまくできませんでした」はどのような事を

>指していますでしょうか?

まさに、結果が sjisに変わってしまうことなんですよ。

2008/10/24 17:57:35
id:ardarim No.3

回答回数897ベストアンサー獲得回数145ここでベストアンサー

ポイント100pt

Windowsのコマンドプロンプトは、マルチバイト環境なのでリダイレクトでUnicodeファイルを出力することはどうやっても不可能です。

コンソールのリダイレクトを使わずに単体のプログラム内で完結したソートをする必要があります。


スクリプトで書いてみましたのでよろしければどうぞ。

適当なファイル名(例:sort.js)で保存して、コマンドプロンプトから

cscript sort.js 入力ファイル名 出力ファイル名

で実行してください。UTF-16の中国語テキストファイル(4MB)がソートできることは確認しました。


fso = WScript.CreateObject("Scripting.FileSystemObject");
wsh = WScript.CreateObject("Wscript.Shell");

if(WScript.arguments.length != 2){
	WScript.echo("入力ファイル、出力ファイルを指定してください");
	WScript.quit();
}

fileName = WScript.arguments.item(0);

try {
	txtFile = fso.openTextFile(fileName, 1, false, -1);
} catch(e){
	WScript.echo(e);
	WScript.echo("ファイルオープンエラー(" + fileName + ")");
	WScript.quit();
}

lines = new Array;

i = 0;
while(!txtFile.atEndOfStream){
	lines[i++] = String(txtFile.readLine());
}

txtFile.close();

lines.sort(function(a,b){ return a.localeCompare(b); });

txtFile = fso.createTextFile(WScript.arguments.item(1), true, true);
for(i = 0; i < lines.length; i++){
	txtFile.writeLine(lines[i]);
}
txtFile.close();

fso = null;
wsh = null;

WScript.quit();

URLはダミー

http://q.hatena.ne.jp/1224777958

id:Vacuum

おおお~すごいでつ。

4GBのファイルがソートできました。

メモリはつかいますけど・・・

これで、問題は解決できました。

2008/10/25 16:30:22
  • id:zzz_1980
    sort --version とうって
    sort (GNU textutils) 2.0
    Written by Mike Haertel.
    と表示されるようなら windows のソートではなくて別のソートコマンドが起動されている可能性があります。
    C:\WINDOWS\system32\sort -L C <LUInit.ini >SORT.OUT
    としてみてください。


  • id:i_kumagoro
    そのオプションで問題が解決されるかどうかは知りませんが、'-L'ではなく'/L'です。
  • id:zzz_1980
    訂正ありがとうございます。
  • id:Vacuum
    出力結果が、シフトJISに変わってしまうので、困っています。

    ファイルの内容は、中国語と韓国語とタイ語などなど多言語で構成されているため、SJISでは、文字化けしてしまうのが最大の問題です。
    また、WINDOWSのソートですと、約4GBくらいのファイルでも何とか数分でソートできますが、ベクターのフリーのソートではプログラムがおちてしまったり
    異様に時間がかかるので、なんとかWINDOWS標準のソートでできないものかと質問してみました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません