![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
以下のインプットファイル(csv)の行と列を入れ替えるスクリプトについて質問させてください。
ID,氏名,都道府県,開始日時,終了日時
0001,山田太郎,東京都,20180110,20180120
0001,山田太郎,東京都,20180310,20180330
0002,佐藤花子,埼玉県,20171110,20171112
0003,山本正,沖縄県,20160916,20160920
0003,山本正,沖縄県,20180421,20180422
0003,山本正,沖縄県,20170707,20170808
ID、氏名、都道府県の値が同じであれば、以下のように開始日時と終了日時の値を1行にしたいのですが、どうすればいいのかわかりません。どなたか教えていただけないでしょうか?
何卒よろしくお願いいたします。
アウトプットファイル(csv)
0001,山田太郎,東京都,20180110,20180310,20180120,20180330
0002,佐藤花子,埼玉県,20171110,20171112
0003,山本正,沖縄県,20160916,20180421,20170707,20160920,20180422,20170808
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?8acaa2e)
No.5ベストアンサー
- 回答日時:
>逆にアウトプットファイルをインプットファイルにして横に整列したものを再び縦に整列させるスクリプトを教えていただけないでしょうか?
以下のようになります。(sample2.plとします)
使用方法は、
perl sample2.pl アウトプットファイル
と入力すると、結果が画面に表示されます。
---------------------------------
$fname = $ARGV[0];
open FH,$fname or die "open error:$!";
while(<FH>){
chomp($_);
@elm = split(/,/,$_); #カンマで分割
$npair = int((scalar(@elm) - 3) / 2); #日付の組数を取得
$key = join(',',@elm[0..2]); #先頭の3個をカンマで連結
#日付の組数分繰り返す
for ($i = 0; $i < $npair; $i++){
#画面に出力する
print $key,",",$elm[3+2*$i],",",$elm[4+2*$i],"\n";
}
}
close FH;
-------------------------------------------
tatsu99さん、おかげさまで自分がやりたいことができました。ありがとうございました。また、スクリプトもわかりやすくコメントも付けていただき勉強になりました。
返事が遅くなりすいませんでした。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?8acaa2e)
No.4
- 回答日時:
>今回インプットファイルを縦から横にまとめましたが、
>逆にアウトプットファイルをインプットファイルにして横に整列したものを再び縦に整列させるスクリプトを教えていただけないでしょうか?
以下の点、確認させてください。
確認1)元のインプットファイルを使えば、アウトプットファイルからインプットファイルを作り直す必要はないと思います。
わざわざ、元に戻すスクリプトを作る理由は何故でしょうか?
確認2)スクリプトで元に戻した場合、完全に元には戻りませんが、宜しいでしょうか。例えば以下のようになります。
元のインプットファイルが以下の場合、
0001,山田太郎,東京都,20180310,20180330
0001,山田太郎,東京都,20180110,20180120
0003,山本正,沖縄県,20160916,20160920
0002,佐藤花子,埼玉県,20171110,20171112
0003,山本正,沖縄県,20180421,20180422
0003,山本正,沖縄県,20170707,20170808
スクリプトで作り直したインプットファイル
0001,山田太郎,東京都,20180110,20180120
0001,山田太郎,東京都,20180310,20180330
0002,佐藤花子,埼玉県,20171110,20171112・・・・①
0003,山本正,沖縄県,20160916,20160920・・・・②
0003,山本正,沖縄県,20180421,20180422
0003,山本正,沖縄県,20170707,20170808
①②の箇所が元のファイルと違ってきます。
確認3)
スクリプトで作り直す場合、作り直したインプットファイルには、見出し行は出力しませんがそれでよろしいでしょうか?
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?8acaa2e)
No.3
- 回答日時:
No2です。
以下のスクリプトを作成します。(sample.plとします)
1行目が見出しなので、1行目はスキップします。
以下のコマンドを実行してください。
perl sample.pl インプットファイル名
結果が画面に表示されます。
ファイルに出力する場合はリダイレクトしてください。
perl sample.pl インプットファイル名 > アウトプットファイル名
とすると、アウトプットファイルに結果が出力されます。
--------------------------------------
$fname = $ARGV[0];
open FH,$fname or die "open error:$!";
%arr = ();
while(<FH>){
if ($. == 1) { next; } #1行目はスキップする
chomp($_);
@elm = split(/,/,$_,5); #カンマで分割
$key = join(',',@elm[0..2]); #先頭の3個をカンマで連結
$day = join(',',@elm[3..4]); #後の2個をカンマで連結
if (exists($arr{$key})){
#既存なら日付を連結
$arr{$key} = $arr{$key} . ',' . $day;
}else{
#新規なら日付を記憶
$arr{$key} = $day;
}
}
close FH;
#画面に出力する
foreach $key(sort(keys %arr)){
print $key,",",$arr{$key},"\n";
}
-----------------------------------
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?8acaa2e)
No.2
- 回答日時:
インプットファイルの1行目は、
見出し(ID,氏名,都道府県,開始日時,終了日時)でしょうか?
それとも
データ(0001,山田太郎,東京都,20180110,20180120 等)でしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 転職 長く続けられる好条件の求人でしょうか? 3 2023/07/12 18:45
- メディア・マスコミ 日本はなんで? 右寄り左寄りの地方紙があるんですか? 12 2023/06/21 07:59
- Excel(エクセル) エクセルの参照について教えてください 1 2022/12/08 16:06
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- ゴールデンウィーク・シルバーウィーク あなたの人生の県の数は? 3 2022/12/04 12:13
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- 世界情勢 沖縄の基地問題と経済について。 7 2022/05/09 13:51
- その他(国内) 3時!夜中なのか早朝なのか微妙な時間、5時に出るならシャワー浴びてお茶淹れて神棚、仏壇 2 2022/05/20 03:58
- 政治 岸田内閣は国民を代表しているでしょうか? 11 2022/05/08 05:56
- その他(地域情報・旅行・お出掛け) 海外旅行に行ったことがないのは今や珍しいですか? 12 2022/12/01 19:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでCSVファイルを途中行まで...
-
VBAでCSVファイルの特定行を書...
-
エクセルVBA コードが同じでも...
-
ExcelをCSV書き出す場合のシー...
-
Javaで同一のファイルを読み込...
-
VBAで巨大なファイルの途中から...
-
DBMとテキストファイルのどちら...
-
ファイルのアップロード方法(Perl)
-
2つのCSVファイルをマッチング
-
Perlの質問:行と列を入れ替え...
-
CGI(Perl)でWeb上から作成...
-
Excelファイルのデータを入力し...
-
JavaでCSVファイルを高速に読む...
-
perlで、後ろの行を読んで、前...
-
VB6.0でDB接続する際に切断時の...
-
ファイルからある文字列の個数...
-
datファイルってなんですか?
-
ファイル内の日付から1週間前...
-
1ファイルずつ読み込みたい
-
タブの色を変更する方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでCSVファイルを途中行まで...
-
VBAで巨大なファイルの途中から...
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルの特定行を書...
-
openした後、closeしないでプロ...
-
ReadLineでの読み出し行を指定する
-
エクセルVBA コードが同じでも...
-
csvファイル改行コードの置換に...
-
Perlの変数に文字数制限(容量...
-
perlにて2つのファイル比較
-
C言語でのファイルのデータ更...
-
JavaでCSVファイルを高速に読む...
-
VB6.0でDB接続する際に切断時の...
-
MATLAB グローバル変数の宣言
-
alarmのタイムアウト後の処理で...
-
DBMとテキストファイルのどちら...
-
perlで、後ろの行を読んで、前...
-
拡張子 ”log” と ” dat” の違い
-
5行おきに5行ずつ抽出するに...
-
テキストデータから指定した1...
おすすめ情報
勘違いをして、「この質問は特に30代・男性の方にリクエストされています!」を選択してしまいました。どなたでも助けていただけると助かります。
インプットファイルの1行目は見出し(ID,氏名,都道府県,開始日時,終了日時)です。
何卒よろしくお願いします。
tatsu99さん、回答ありがとうございました。とても分かりやすいスクリプトで大変勉強になりました。おかげさまでやりたいことができました。
大変申し訳ないですが、これに関連した質問をさせてください。
今回インプットファイルを縦から横にまとめましたが、逆にアウトプットファイルをインプットファイルにして横に整列したものを再び縦に整列させるスクリプトを教えていただけないでしょうか?
ずっと考えていていくつか試してみたのですが、うまくいきません。
何卒よろしくお願いいたします。
返答ありがとうございます。確認点について回答させていただきます。
確認1について、不可思議なことをお願いしてすいません。実は仕事でいくつかのツールを使用するのですが、一つだけインプットデータの形式を横に並べた形式にしないといけない仕様になっており、アウトプットもインプットと同じ横に並んだ形式になっております。そのツールを使用後、そのアウトプットを使用し、ほかのツールを使用する予定で、その際のインプットデータの形式が縦に並んだ形式なもので、今回質問させていただきました。わかりにくくてすいません。
確認2について、はい、大丈夫です。レコード(行)の順番が違っても問題ありません。
確認3について、見出し行は必要ありません。
何卒よろしくお願いいたします。