品名の文字数でソートするにはどうしたらよいでしょうか?
※行数が100万行以上ありExcelでは扱えません。
※品名と金額の間はタブで区切られているとします。
★例(実際は100万行以上あります)★
<ソート前データ>
りんご 1000円
鉛筆 20円
ジャガイモ 210円
<ソート後データ>
鉛筆 20円
りんご 1000円
ジャガイモ 210円
パッと思いつく物としては
タブを「,」に置き換えてCSV形式として保存し
EXCELでソートしてCSVで書き戻してから「,」をタブに戻すとか
参考:CSV形式
以下のソフトを用いたらいかがでしょうか?
ozsort テキストデータベース(並べ替え)
もっと具体的に教えてください。
1.PostgreSQLサーバをインストールする。
2.テーブルを作る
CREATE TABLE tablename(columnname type,.....) ;
3.データを入れる。
COPY tablename FROM 'filename' ;
参照。
http://www.postgresql.jp/document/pg820doc/html/sql-copy.html
4.並べ替える。
SELECT * FROM tablename ORDER BY char_length(columnname) ASC
参照。
http://www.postgresql.jp/document/pg820doc/html/functions-string...
5.タブ区切りファイルに書き出す。
COPY tablename TO 'filename';
MS Accessで下記構成のテーブルを作成して
データを取り込んで、下記クエリを作って
実行すると、200万件のソート結果が
表示できました。
テーブル名:Test
品物名:フィールド1
価格:フィールド2
クエリ内容:
SELECT フィールド1, フィールド2
FROM Test
ORDER BY lenb(フィールド1);
最終手段として…Perlで。
まずActivePerlをインストールします。
ここから(項目は入力せずcontinueを押して先へ行けます。)
ActivePerlのインストール方法を参考にして下さい。
以下のコードを
#!perl
$data = 'data_file.txt'; #データの入っているファイル
$new_file_name = '>>newlist.txt'; #作成するファイル名「>>」は必要です
open DATA, $data;
open NEW, $new_file_name;
print NEW sort {
length( (split /\t/,$a)[0] ) <=> length( (split /\t/,$b)[0] )
}<DATA>;
C:\tmp\sort.plのように保存、
コマンドプロンプトから
perl C:\tmp\sort.pl を実行すると出力されます。
このコードはメモリを非常に使います。だいたいデータ量の4倍です。40MBなら120MB以上の空きが必要です。時間もそれなりにかかります。32MBの150万件のデータで5分くらいです。
ありがとうございます。Perlの知識はないのですが、きっとPerlなんかだとすぐできるんだろうな、と思っていました。
早速やってみたのですが文字化けしてしまいました。
ファイルがUnicode形式だったからでしょうか?
Unicode(UTF-16LE)でしたら、以下のコードで
#!perl $data = 'C:\data\data_file.txt'; #データの入っているファイル $new_file_name = 'newlist.txt'; #作成するファイル名 open DATA, "<:encoding(utf16-le)", $data; open NEW, ">:raw:encoding(utf16-le)", $new_file_name; print NEW sort { length( (split /\t/,$a)[0] ) <=> length( (split /\t/,$b)[0] ) }<DATA>;
エンコードする分時間がかかります。
これでダメならデータをいったんTeraPadなどのテキストエディタでShift-Jisにして、最初のコードで出力後、Unicodeにする手もあります。
やはり文字化けしてしまいます。
中国語が混じっているため、Shift-jisにはできないんです。
きっと教えていただいたことは正しく、私のファイルの問題だと思います。
ありがとうございます。
Excelで扱える行数ではありません。