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

CGIでテキストファイル(test.csv)を1行ずつ読み込み、
値を置換したいのですが、Perlは初めてで全然わかりません。
項目はタブ区切りで以下のようになっています。
このデータから誕生月が1桁の場合は"09"、性別は男なら"1"、女なら"2"としたいのです。
(test.csvの中身)
年月日 氏名 誕生月 誕生日 性別
060904 日本太郎 10 4 男性
060904 日本花子 9 4 女性

どなたか助けてください。

●質問者: Sugipon
●カテゴリ:ウェブ制作
✍キーワード:CGI CSV Perl test テキスト
○ 状態 :終了
└ 回答数 : 7/7件

▽最新の回答へ

1 ● spyglass
●5ポイント

こんばんは。

ある程度のスキルは必要かと思いますが以下のサイトでcgiを使用出来るサーバをレンタルしてください。

無料でレンタル出来るかと思います。

http://www.kooss.com/hp/

次に変換するソースを作ってアップします。

ソースは以下を参考にしてみてください。

http://perl.misty.ne.jp/index.html

基本的には「11ファイルの処理」と「08文字の扱い」と「03処理の制御1」の処理が参考になるかと思います。

◎質問者からの返答

すでに動作するサーバはあり、簡単にはテストをしていますが、記述方法がいまいち不明です。。

サンプルページがあるとうれしいのですが。


2 ● cubick
●10ポイント

$record に1行毎のデータが入っているとして…

# フォーマットは以下の通り
# $record = "年月日\t氏名\t誕生月\t誕生日\t性別";

# タブ区切りでフィールドを分割
($date,$name,$month,$day,$sex) = split(/\t/,$record);

# 1桁(=10未満)なら0を補完
$month = "0" . $month if($month < 10);

# 性別の判定
if($sex eq "男性") {
$sex = "1";
elsif($sed eq "女性") {
$sex = "2";
}

あとはループで処理すればOKかと思います。


3 ● spyglass
●0ポイント

どの辺りが不明なのかもう少し教えて頂けますか。

1、ファイルのオープン・クローズは分からないのか?

2、文字列の中から任意の文字の変換が分からないのか?

まったく同じサンプルのページは無いかと思われますので教えてください。


4 ● yoshi_12
●50ポイント

作ってる間に、似たようなコードを提供してくださった方がいたみたいなんですが

せっかくなので掲載させていただきます。

※動作確認はしましたが、念のためバックアップをとってから試してください。

※私はperlを極めてるわけではないので、他の方がもっとシンプルなコードを提供してくださるかもしれません。


open (FH,"+< test.csv"); #読み書きモードでファイルをオープン

@line=<FH>; #ファイルを行ごとの配列に格納

chomp(@line); #改行コード切捨て

$line_amount=$#line+1; #行数計算


#各行を列単位に分割

for($i=0;$i<$line_amount;$i++){

($nengappi[$i],$shimei[$i],$tanjyoutuki[$i],$tanjyoubi[$i],$seibetu[$i])=split(/\t/,$line[$i]);

}


#誕生月の処理

for($i=0;$i<$line_amount;$i++){

$tanjyoutuki[$i]=sprintf("%02d",$tanjyoutuki[$i]);

}


#性別の処理

for($i=0;$i<$line_amount;$i++){

if($seibetu[$i] eq "男性") {

$seibetu[$i]=1;

}

elsif($seibetu[$i] eq "女性"){

$seibetu[$i]=2;

}

}


truncate(FH, 0); #ファイルをゼロクリア

seek(FH,0,0); #ファイルポインタを先頭に移動


#処理したデータを書き込み

for($i=0;$i<$line_amount;$i++){

print FH $nengappi[$i]."\t".$shimei[$i]."\t".$tanjyoutuki[$i]."\t".$tanjyoubi[$i]."\t".$seibetu[$i]."\n";

}

close (FH);


質問者さんはperlを勉強したいのでしょうか?

それとも、今回、たまたまこのようなシステムが必要になっただけで習得は望んでいないのでしょうか?


前者の場合は、ソースコードをまるまる渡すという行為はよくなかったかもしれませんね。

前者かもしれないので、perlの基礎講座のようなサイトをいくつかのせておきます。

http://www.site-cooler.com/kwl/perl/

http://www.kent-web.com/perl/index.html

http://www.poizun.jp/content/cgi/reference/

◎質問者からの返答

ありがとうございます。

どちらかというと勉強したいというより、仕事で急に必要になったものですから。。。


5 ● まきのっぴ
●10ポイント

こんな感じでしょうか?

#!/usr/bin/perl

print "Content-Type: text/plain\n\n"; # HTTPレスポンスヘッダ

my $file = 'test.csv'; # 読み込むファイル名

open(my $fd, $file); # ファイルを開く

print scalar <$fd>; # 1行目はそのまま出力

foreach (<$fd>) { # 以下1行ずつ読み込み

    chop; # 行末の改行削除

    my @cols = split("\t", $_); # タブで分割して配列へ

    $cols[2] = sprintf('%02d', $cols[2]); # 2桁目は0フィル2桁整数変換

    $cols[4] = 1 if $cols[4] eq '男性'; # 4桁目は男性なら1

    $cols[4] = 2 if $cols[4] eq '女性'; # 4桁目は女性なら2

    print join("\t", @cols), "\n"; # タブで結合して改行をつけて出力

}

close($fd); # ファイルを閉じる

実際には文字コード違いへの配慮や余計な空白の除去や諸々の例外処理を考える必要がありますが、その辺ばっさり省略しています。

蛇足ですが、CSV は Comma Separated Value (カンマで区切られた値) という意味ですので、タブ区切りテキストなら TSV (Tab Separated Value) と呼ぶのが適切かと思います。(Excel の場合拡張子は .txt になりますが)


1-5件表示/7件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



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