人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

エクセルに次のようなCSVをインポートします。
項目A,項目B,項目C,項目D,単価A,単価B,単価C,単価D,数量A,数量B,数量C,数量D,金額A,金額B,金額C,金額D
項目X,項目Y,項目Z,単価X,単価Y,単価Z,数量X,数量Y,数量Z,金額X,金額Y,金額Z




これを、
項目A 単価A 数量A 金額A
項目B 単価B 数量B 金額B
項目C 単価C 数量C 金額C
項目D 単価D 数量D 金額D
項目X 単価X 数量X 金額X
項目Y 単価Y 数量Y 金額Y
項目Z 単価Z 数量Z 金額Z




のように並び替える方法はありませんか?
※VBAは後々メンテナンスできる人がいなくなるのが嫌なので使いたくありません

項目数は20くらいを上限に変動する前提です。

●質問者: P-mako
●カテゴリ:コンピュータ 科学・統計資料
✍キーワード:CSV VBA インポート エクセル メンテナンス
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● apr-25
●5ポイント

http://q-apr25.ne.jp/ (dummy)

項目、単価、数量、金額毎に編集のコピー、形式を選択して貼り付けで行列を入れ替えて貼り付ければよいのでは。ブックやシートは読み込んだブックやシートと異なっていても可能です。

◎質問者からの返答

項目Aから始まる1件の請求書、項目Xから始まる1件の請求書・・・のように全体で500件ほど存在します。

これを手動ではなく自動で上記のような並び替えをしたいです。


2 ● russian-blue
●10ポイント

gawkを使った並べ替え

----------------------------------

gawk

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

----------------------------------

ファイル:csvconv.awk

BEGIN {

 # 区切り文字
 FS=",";


 # 各項目は4つのデータより項目+単価+数量+金額
 # なる。
 ITEM=4;

}

# 並び替え
{
 # カラムがITEMより少ない場合は無視
 if( NF < ITEM ) next;

 # 項目数がITEMの倍数ではない倍無視
 if( (NF % ITEM)!=0 ) next;

 # 項目数を数える カラム数/項目
 ITEMS=NF/ITEM;

 # 先頭は項目
 for( i=1; i<= ITEMS;i++ ) {
 printf("%s",$i);
 # 各項目は繰り返し
 for( j=ITEMS+1; j<= NF; j+= ITEM ) {
 printf(",%s",$j);
 };
 printf("\n");
 };
}

DOSのコマンドラインで

gawk -f csvconv.awk xxx.csv

とすると画面変換されたものが

表示される

保存する場合は

gawk -f csvconv.awk xxx.csv > yyy.csv

のようにする

◎質問者からの返答

ありがとうございます。

VBAという限定的な表現がまずかったですね。

プログラムで処理してしまうと、実際にデータ操作する人がメンテナンスできなくなってしまうという意図でした。

DOSにawkを入れるくらいだったら、Linuxで処理してしまいますが、それだといつまでも面倒見てあげないといけないので・・・


3 ● JunK
●65ポイント ベストアンサー

考え方は、

・1行に何個変数があるのか

#1行目は4、2行目は3

#=COUNTIF(test!1:1,"項目*") で判断

・必ず 項目×n,単価×n,数量×n,金額×n の形式

・これを 1つのセル内で 項目A,単価A,数量A,金額A の形に変換

・並び替えたものを、テキストエディタに 貼り付ける。

・セルの区切りが タブ(スペース??)になるので、それを 改行(ニューライン, キャリッジリターン ???)に変換する。

・それをexcelに読み込ます

これで完成となります。


http://investment.up.seesaa.net/files/test_w.xls

まぁ、xlsを参照下さい。

[test]に変換前のcsvデータを貼り付け、その大きさに合わせて、

・・・というかひたすらでかくてもよく・・・

[check]を修正(領域拡大)すると、前準備修正完了です。


http://www.shuiren.org/chuden/teach/hidemaru/seiki/01.htm

そしたら、エスケープシーケンスで置換できるエディタにC列以降のデータを貼り付けて、セル区切りに相当する文字を改行コードに置換、これをexcelに読み込ませれば、目的の物が得られるかと思います。

◎質問者からの返答

ほぼ完璧なご回答です。ありがとうございます。

蛇足になりますが。

「項目*」というのはサンプルなので実際には、もっと不定形なネーミングになります。

→ ただし、そこはCOUNTAを4(項目/単価/数量/金額)で割ることで対処

改行コードは、char(10)で表現できますので、存在する項目数分だけ改行コードをデリミタに連結可能です。

これをテキストエディタにペーストして、ダブルクォート(改行を含むセルはクォートされる)を除去すれば、できあがりです。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ