[過去ログ] プログラミングのお題スレ Part13 (1002レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
494
(7): 2019/03/04(月)18:59 ID:R4eMfGlu(1)調 AAS
お題 全角空白区切のCSV

カレントディレクトリにあるCSVファイルを読み込み、指定されたカラム名のデータの合計を求める。
1レコード目にはカラム名がある。
区切り記号は全角空白とする。 データの数字は全てASCII数字だとする。

CSVファイル内のデータ例

カラム1 カラム2 カラム3 カラム4
1,0 2.0 3.0 4.0
2.1 3.1 4.1 5.1
------データ例終わり

出題 カラム3 の合計を求めよ。
解答例 カラム3 = 7.1
496
(1): 2019/03/04(月)19:03 ID:rdjSvZ2C(1/3)調 AAS
>>494 間違い

データに 1,0 という間違いがあるけど問題ないだろ。
ついでに、この状態でカラム1の様にデータフォーマットが違う場合には正しくデータエラーを報告せよ。
499
(1): 2019/03/04(月)19:12 ID:TpCWsYE8(1/3)調 AAS
>>494
awk。-F オプションで指定しているのが全角スペースね。OSやシェルの違いによってはシングルクオーテーションではなくダブルクォーテーションにする必要がある。入力はファイル名指定するか標準入力から読ませる。

awk -F' ' 'BEGIN{getline}{n+=$3}END{print n}'
507
(1): 2019/03/05(火)03:28 ID:CZi591h7(1)調 AAS
>>494
Ruby で

require 'csv'

# 全角空白区切りで、ヘッダー有り
options = { :headers => true, :col_sep => " " }

# CSV ファイルを、1行ずつ処理する
puts CSV.foreach( "input.csv", options )
.map{ |row| row[ 2 ].to_f }.inject( :+ )
543: 2019/03/07(木)03:21 ID:QS9GxyX4(1)調 AAS
>>494
Kotlin
https://paiza.io/projects/w5ywqyfGfQpwllH68rmt5A

入力はカラム名の行が最初にあり、次の行からはデータが続き「# カラム名」の行で終わり、
そこで指定したカラム名の列の合計値が出力される。

エラーはデータが数値として解釈できない文字列、項目数がカラム名の数と一致しない行、
同一カラム名があった場合に出る。一度エラーになると # の行まで読み飛ばされる。
737
(1): 2019/03/17(日)22:48 ID:t+AGMGYK(1)調 AAS
>>494
(CSVはコンマ区切りの値だよ)
741: 2019/03/18(月)00:38 ID:9+FFV4Nx(1)調 AAS
>>494 >>496 Perl5
use feature say;
@data = <DATA>;
chomp @data;
@tags = split' ', shift @data;
%idx = map{$_ => $n++} @tags;
@sum = 0 x $n;
for (@data) {
 @fs = split' ';
 for (0..$n-1) {
  $v = $fs[$_];
  if ($v =~ /^(\d+\.\d*|\d*\.\d+|\d+)$/) {
   $sum[$_] += $v;
  } else {
   warn "変なデータが紛れ込んでいます_ノ乙(、ン、)_`$v'\n";
  }
 }
}
for (@tags) {
 say "$_ の合計 = ", $sum[$idx{$_}];
}
__DATA__
カラム1 カラム2 カラム3 カラム4
1,0 2.0 3.0 4.0
2.1 3.1 4.1 5.1

~ $ perl 13_494.pl
変なデータが紛れ込んでいます_ノ乙(、ン、)_`1,0'
カラム1 の合計 = 2.1
カラム2 の合計 = 5.1
カラム3 の合計 = 7.1
カラム4 の合計 = 9.1
745: 2019/03/21(木)11:30 ID:4Lv8Ku6J(1/2)調 AAS
>>494 Squeak Smalltalk。コンマを分割と見なしそれぞれについての和を出力させてみた

| fn |
fn := [:columnName |
FileStream oldFileNamed: 'data.txt' do: [:file |
| index sum |
index := (file nextLine subStrings: ' ') indexOf: columnName.
sum := 0.
[file atEnd] whileFalse: [
| next |
next := ((file nextLine subStrings: ' ') at: index) subStrings: ','.
sum := sum + (next size = 1 ifTrue: [next anyOne] ifFalse: [next])].
sum
]
].

fn value: 'カラム3'. "=> 7.1 "
fn value: 'カラム1'. "=> #(3.1 2.1) "
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.037s