• ベストアンサー

『数字の3桁毎にカンマを付ける』に関して

こんにちわ!NAKANOです。 タイトルの事なのですが、検索エンジンで調べて 殆ど回答らしき事はかいてあるのですが、解らない 事が結構あるので掲載させて頂きます。 まず環境は数行あるCSVのデータから一部の行だけを 引っ張ってテーブルに流す方法までは行き着きました。 で、そのテーブル表示させた値はさまざまで項目毎に 「<TD>」で分けております。一番右端が数字なのですが、 これに「3桁毎のカンマ」を付けたいのですが、色んな サイトで紹介されている手法を参考にやってみたのですが どうにも上手くいかなくて…(汗) それでここに質問させて頂いた次第で御座います。 最終的に『1,234,567,890』って感じになれたらな~ って思っています。 宜しくおねがいいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tokebi
  • ベストアンサー率100% (1/1)
回答No.4

入力ファイルが  テスト1,テスト2,テスト3,テスト4,123456789.01 とした場合ですと open(DATA, "test.csv"); while(<DATA>) { s/[\r\n]*$//; @cols = split(/,/); foreach $col (@cols) { $col =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g; # ここでカンマクギリ(BLUEPIXY様の小数点対応版をしよう) print "[$col]"; } print "\n"; } close(DATA); とすればいいかとおもいますが? もしかしてですが  テスト1,テスト2,テスト3,テスト4,123,456,789.01 こうなってるとか? だとしたら、項目数がわかってることが前提になりますが、 open(DATA, "test.csv"); while(<DATA>) { s/[\r\n]*$//; @cols = split(/,/, $_, 5); # ','で5個まで分けてそれ以降は分けない foreach $col (@cols) { print "[$col]"; } print "\n"; } close(DATA); とすればいいのでは?

naka225
質問者

お礼

tokebi 様。お世話になっております。 戴いたソースをそのまま使ってみると上手くいくのは 確認できます。私が作ったCGIにもいくつかは適用 出来ました。何となくは理解できたのですが、データ をテーブルに流して表示させている場合はやはり出来 なかったです… でも3桁毎にカンマを入れる手法の質問としては解決 なのでここは一旦閉じさせて戴きます。 大変参考になりました。本当にありがとう御座います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

>扱い方がわかりませんでした ,区切りのフィールドを切り出したあと、 $colに数値が入っているのが判っているとしたら $col=commify($col); とすれば、$colにカンマ区切りの文字列が入ります。 sub commify { … } の部分は、どこか邪魔にならない場所(スクリプトの最後とか)にでも置いておけばいいです。

naka225
質問者

お礼

BLUEPIXY 様。お世話になっております。 おかげ様で仕組みは何となく分かったのですが、 下で返答した様にテーブルがどうも… また改めて質問はさせていただこうかと思います。 取り合えず一旦は解決ということで閉じます。 本当に何度もありがとう御座いました。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

1 while $text =~ s/(.*\d)(\d\d\d)/$1,$2/; とか?

naka225
質問者

お礼

Tacosan 様。お返事ありがとう御座います。 先にお返事いただきました方のと同様、扱いがわかりませんでした。すいません・・・

naka225
質問者

補足

ここで追記の質問をします。 CSVを読んでテーブルに流す仕組みのCGIファイルを Perlで作ったのですが、このCGIファイルに組込む んですよね?Perlファイルで作っても上手くいきませ んでした。ひょっとしてCSVでは出来ない?のかなぁ… 私が使っているソースは以下のものが基本形になっています。 open(DATA, "test.csv"); while(<DATA>) { s/[\r\n]*$//; @cols = split(/,/); foreach $col (@cols) { print "[$col]";} print "\n";} close(DATA); 因みに『split(/,/);』を使わなければ3桁ごとにカンマ は入るようです。 何かご教授いただければ・・・・お願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

クックブックに載っていたものを転載しておきます $num=1234567.89; $commaNum=commify($num); print "$commaNum\n"; sub commify { #クックブック 2.16(P103) my $text = reverse $_[0]; $text =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g; return scalar reverse $text; } 基本的なアイデアは逆にしてから3桁ずつ区切って、カンマを挿入して、また逆にして戻す、のが簡単です。 上記の方法では小数点にも対応しています。

naka225
質問者

お礼

BLUEPIXY 様。お返事ありがとう御座います。 先ほどの方と同様扱い方がわかりませんでした。すみません・・・・

全文を見る
すると、全ての回答が全文表示されます。
  • tokebi
  • ベストアンサー率100% (1/1)
回答No.1

実際に私が使っている関数です。 $CommajExpPerHour = '1000' ; &commas ( *CommajExpPerHour ) ; print $CommajExpPerHour."\n"; sub commas { local( *n ) = @_; while ( $n =~s!(.*\d)(\d\d\d)!$1,$2! ) { ; } }

naka225
質問者

お礼

tokebi 様。お返事ありがとう御座います。 ですが扱い方がよくわかりませんでした・・・

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • アクセスのテーブルからエクスポートした際のケタ落ち

    Accessの通常のテーブルからエクスポート (業務系DBにインポートする為にカンマ区切りのcsvファイル) する際に、小数4桁のフィールドが2桁に切り捨てられてしまいます。 テーブルの定義で4桁固定等色々試してみたのですが・・。 エクスポートのウィザード画面では4桁まで見えているのですが、 実行後にcsvファイルを見ると2桁に切られてしまっています。 これを避けるにはどの様にすれば良いのでしょうか? 初歩的な質問かも知れませんが、どうぞ宜しくお願いいたします。

  • CSVの3行目だけを…

    はじめまして!Nakanoと申します。 えっと、以下質問になります。おねがいします。。 CGI/Perlを始めて1週間程度の素人なのですが、 CSVファイルをHTMLのテーブル表示させる 様にしたいなと思っています。 そこで用意したCSVファイルが5行と8列で カンマ区切りのみで構成されています。 このCSVファイルから3行目だけを抽出する方法 ってありますでしょうか? 1行目のみ表示や1行目以外の2行目以下全てを表示 させたりは出来たのですが、3行目だけを表示するの がどうしても分かりませんでした・・・・・ 何方様か。よろしければその辺の所を詳しくご指導 いただけないでしょうか? よろしくおねがいします。

    • ベストアンサー
    • Perl
  • 数字のカンマ区切りの文字列を分解したい

    SQLのみで以下の様なことをしたいのですが、やり方が分かりません。 何かしら手法をお知りの方はご教授願いたく存じます。 ▼Postgresバージョン 8.1 ▼テーブル情報 id, numbers 1, '0,20,10,30,50' 2, '10,20,30,50,60' ↓ numbers の値をカンマ( , )で分解し、加算したい。 例)  '0,20,10,30,50' → 0 + 20 + 10 + 30 + 50 → INTEGERの 110 を取得 ※regexp_split_to_table の関数は、postgresのバージョンが古いために使用できませんでした。 postgresのバージョンを上げる事が出来ないため、8.1でも可能な対応方法を模索しています。

  • CSVデータの行数カウントをしたいのですが・・

    CSVデータの行数カウントをしたいのですが・・ どうしたらよいでしょうか? 目的は <tr> <td><?=$奇数行のデータ?></td> <td><?=$偶数行のデータ?></td> </tr> のように 2列のテーブルに奇数行と偶数行を出力させるためです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 配列出力をカンマ区切りに変換(PHP)

    DOMを使ってテーブルのスクレイピングをしたいと考えています。 【sample.html】 <table id="rates"> <tr> <th>施設名</th> <th>所在地</th> </tr><tr> <td>大谷地</td> <td>東3丁目3-20</td> </tr><tr> <td>札幌</td> <td>東1丁目1-20</td> </tr></table> 【scre.php】 <?php $entries = []; $dom = new DOMDocument; @$dom->loadHTMLFile('sample.html'); $xpath = new DOMXpath($dom); foreach ($xpath->query('//tr') as $i => $node) { if (!$i) { continue; } $entries[] = [ $xpath->evaluate('string(td[0])', $node), $xpath->evaluate('string(td[1])', $node), ]; } echo "<pre>"; print_r($entries); echo "</pre>"; ?> *************** 結果(出力値) *************** Array ( [0] => Array ( [0] => 大谷地 [1] => 東3丁目3-20 ) [1] => Array ( [0] => 札幌 [1] => 東1丁目1-20 ) 【やりたいこと】 この結果をカンマ区切りとして抽出したいと考えています。 ***************** 希望結果(希望出力値) ***************** 大谷地,東3丁目3-20 札幌,東1丁目1-20 また、このテーブルは別途CSVファイルに落とす予定のため、 echo $data; という形で出力可能なようにしたいと考えています。 初心者的質問で大変恐縮ですが、どうすればいいかご教授いただけましたら幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP+MySQL でのcsvファイルインポート

    PHP + MySQL で、他システムから出力されてきたcsvファイルをテーブルへインポートしたいと考えています。 LOAD DATA INFILE で取り込もうとしていますが、対象のcsvファイルの特徴のためにうまく行かず苦戦しています。 取り込みたいファイルは、以下のようになっています。  ・各フィールドが "(ダブルクォート) で囲まれている  ・各フィールドは ,(カンマ) で区切られている  ・金額の項目には、桁区切りのカンマが入っている  例) "0001","あああああ",…(中略)…,"105,000","100,000","5,000",…     コード 項目名            税込み  税抜き 消費税  というような形です。    困っているのは、金額に使われている、桁区切りのカンマの処理についてです。  目的としては、データベースへ取り込むときには 105,000 は 105000 として取り込めればいいのですが、他システムから、桁区切りがなされた状態でcsvが作成されてきています。 LOAD DATA INFILE test.csv INTO TABLE data_table FIELDS TERMINATED BY ',' ENCLOSED BY '\"' IGNORE 1 LINES;  各項目のダブルクォートはENCLOSED BY で、項目を分けるカンマはTERMINATED BYで処理できていると思うのですが、金額の区切りに使われているカンマと項目の区切りのカンマを区別させられずに苦戦しています。  事前にcsvを加工するのも考えてはいるのですが、なるべくcsvを加工せずにそのまま取込したいと思います。  何か、簡単に回避できる方法等があればご教示願います。  宜しくお願いします。

    • ベストアンサー
    • PHP
  • SQL*LoaderでCSVから指定した列のみインポートしたい。

    SQL*Loaderを用いてOracleのテーブルにデータを格納 しようと思っています。 格納するデータはカンマ区切りのCSVファイルです。 入力CSVファイルは他テーブル用のファイルなので、 ローダーで落とし込むテーブルとは列数が異なります。 ですので、「CSVの5列目の値をテーブルのAA_NOというフィールドに 格納する。ということが可能なのでしょうか?」 CSVファイルのある行が a,b,c,d,e,f というデータの場合、テーブルには a,e,f とインポートしたいのです。 よろしくお願いします。

  • 数字を書くときに3桁ごとにカンマを打つことについて

    数字を書くときに3桁ごとにカンマを打ちます。けれど日本語の単位は4桁ごとにくりあがります。万、億、兆というように。金融関係の人は慣れているのでしょうが、長い桁になると指で数えないといくつなのか分かりません。昔の小学校では4桁でカンマを打つように習った覚えもあるのですが…。 なぜ3桁でカンマを打つのか、どなたかおしえていただけないでしょうか?単にアメリカに合わせているだけなのでしょうか? たいした意味がないのであれば、4桁でカンマを打つようにみなでかえられないものでしょうか?

  • csvの特定のキーワードを指定して、そのキーワードを含む行を表示させる方法

    こんにちは。いつも参考にさせてもらっています。 さて、下記のコードはcsvのデータをphpにて読み込み、各項目ごとに分割をして、指定した行のみをtableに表示させているのですが、実際は行を指定するのではなく、特定のキーワードを指定し、その指定したキーワードの行をtable上に表示させたいのです。 自分なりに調べてみたのですが、うまくいかない理由がわからなかったので今回投稿させて頂きました。 よろしくお願い致します。 <?php $openfile = file_get_contents('sq-tyo.csv'); $csv_gyo = split("\n", $openfile); echo "<div>"; list($from, $class, $to, $type1, $type2, $kikan) = split(",", $csv_gyo[0]);//1行目 echo "<table>"; echo "<tr>"; echo "<td>"; echo "<b>出発地</b>"; echo "</td>"; echo "<td>".$from."</td>"; echo "<td>"; echo "<b>座席クラス</b>"; echo "</td>"; echo "<td>".$class."</td>"; echo "</tr>"; echo "<tr>"; echo "<td>"; echo "<b>目的地</b>"; echo "</td>"; echo "<td>".$to."</td>"; echo "<td>"; echo "<b>種類</b>"; echo "</td>"; echo "<td>".$type1."</td>"; echo "</tr>"; echo "<tr>"; echo "<td>"; echo "<b>経路</b>"; echo "</td>"; echo "<td>".$type2."</td>"; echo "<td>"; echo "<b>期間</b>"; echo "</td>"; echo "<td>".$kikan."</td>"; echo "</tr>"; echo "</table>"; ?> 本当はデータベースを使用したいのですが、今回はcsv使用のみと言われてしまったので、ご協力をお願いいたします。

    • ベストアンサー
    • PHP
  • データベースの中身をテーブルで表示したいです

    mysqlデーターベースの中身をテーブルで表示したいのですがわからない事があるので書き込みしました。 テーブルAのデーターを <TABLE> <TR><TD>mysql1行目</TD><TD>mysql2行目</TD></TR> <TR><TD>mysql2行目</TD><TD>mysql4行目</TD></TR> </TABLE> <TD></TD>の間にレコード一つ分のデータを入れて2列で表示したいです。 whileを使ってデーターを取り出すと1行にレコード一つ分のデーターを表示するのはそのままできるんですが1行にレコード二つ分のデーターを出す場合<TR>と</TR>をどういう仕組みで表示させれば良いかわかりません。 誰か教えてもらえないでしょうか?

    • 締切済み
    • PHP