以下のような、品名とその金額が書かれたテキストがあります。

品名の文字数でソートするにはどうしたらよいでしょうか?

※行数が100万行以上ありExcelでは扱えません。
※品名と金額の間はタブで区切られているとします。

★例(実際は100万行以上あります)★

<ソート前データ>
りんご 1000円
鉛筆 20円
ジャガイモ 210円


<ソート後データ>
鉛筆 20円
りんご 1000円
ジャガイモ 210円

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

回答7件)

id:snpgr No.1

回答回数27ベストアンサー獲得回数3

ポイント18pt

パッと思いつく物としては

タブを「,」に置き換えてCSV形式として保存し

EXCELでソートしてCSVで書き戻してから「,」をタブに戻すとか

参考:CSV形式

http://www.morgan.co.jp/kiso/3file-4.htm

id:tetlis

Excelで扱える行数ではありません。

2007/09/11 12:32:52
id:kopj No.2

回答回数123ベストアンサー獲得回数6

ポイント17pt

以下のソフトを用いたらいかがでしょうか?

ozsort テキストデータベース(並べ替え)

http://www.vector.co.jp/soft/win95/util/se290604.html

id:Yota No.3

回答回数453ベストアンサー獲得回数28

ポイント17pt

タブ区切りファイルからリレーショナルデータベースのテーブルにINSERTすれば、文字列の長さでソートできます。

例えば、

http://www.postgresql.jp/

id:tetlis

もっと具体的に教えてください。

2007/09/11 14:51:02
id:Yota No.4

回答回数453ベストアンサー獲得回数28

ポイント17pt

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';

id:aside No.5

回答回数339ベストアンサー獲得回数31

ポイント17pt

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

MS Accessで下記構成のテーブルを作成して

データを取り込んで、下記クエリを作って

実行すると、200万件のソート結果が

表示できました。

テーブル名:Test

品物名:フィールド1

価格:フィールド2

クエリ内容:

SELECT フィールド1, フィールド2

FROM Test

ORDER BY lenb(フィールド1);

id:minesouta No.6

回答回数23ベストアンサー獲得回数2

ポイント17pt

最終手段として…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分くらいです。

id:tetlis

ありがとうございます。Perlの知識はないのですが、きっとPerlなんかだとすぐできるんだろうな、と思っていました。

早速やってみたのですが文字化けしてしまいました。

ファイルがUnicode形式だったからでしょうか?

2007/09/12 09:29:54
id:minesouta No.7

回答回数23ベストアンサー獲得回数2

ポイント17pt

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にする手もあります。

id:tetlis

やはり文字化けしてしまいます。

中国語が混じっているため、Shift-jisにはできないんです。

きっと教えていただいたことは正しく、私のファイルの問題だと思います。

ありがとうございます。

2007/09/13 22:45:13

コメントはまだありません

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

トラックバック

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

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

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