質問編集履歴

1

csvファイルの読み込みができていなかったのでファイルの読み込みのやり方を参考に修正しました。

2022/05/07 15:21

投稿

wagashi_157
wagashi_157

スコア51

test CHANGED
File without changes
test CHANGED
@@ -17,8 +17,25 @@
17
17
  曇 暑 普通 無 ○
18
18
  雨 暖 高 有 ×
19
19
  ```
20
+ ちなみに, 最終的には以下のように出力されるのが目標です。
21
+ ```
22
+ 天気 -> 雨 -> ○ = 3
23
+ 天気 -> 雨 -> × = 2
24
+ 天気 -> 晴 -> × = 3
25
+ 天気 -> 晴 -> ○ = 2
26
+ 天気 -> 曇 -> ○ = 4
27
+ 風 -> 無 -> × = 2
28
+ 風 -> 無 -> ○ = 6
29
+ 風 -> 有 -> × = 3
30
+ 風 -> 有 -> ○ = 3
31
+ 湿度 -> 高 -> ○ = 3
32
+ 湿度 -> 高 -> × = 4
33
+ 湿度 -> 普通 -> ○ = 6
34
+ 湿度 -> 普通 -> × = 1
35
+ ...
36
+ ```
20
37
  ### 発生している問題・エラーメッセージ
21
- エラー出ないのですが, 出力結果が表示されせん。csvファイルの読み込みができていが分からないのでもらえるとありがたいです。
38
+ csvファイルの読み込みと頻度表示できたのですが, 出力結果がアドレス表示になってしています。そ原因よく分からないので教えほしいです。
22
39
  ### 該当のソースコード
23
40
  ```Perl
24
41
  #!/usr/bin/perl
@@ -29,26 +46,46 @@
29
46
  main();
30
47
 
31
48
  sub main {
32
- open(my $IN,"test.csv");
49
+ my %TrainData=mkDataHash("test.csv");
33
- my %TrainData;
50
+
34
- my @list=split(/\t/,%TrainData);
35
51
  foreach my $tag (keys %TrainData)
36
52
  {
37
53
  foreach my $data (keys %{$TrainData{$tag}})
38
54
  {
39
55
  foreach my $det (keys %{$TrainData{$tag}{$data}})
40
56
  {
41
- pop(@list);
42
- my $fo = $TrainData{$tag}->{$data}->{$det};
57
+ my $f = $TrainData{$tag}->{$data}->{$det};
43
- print("$TrainData{$tag}->$TrainData{$data}->$TrainData{$det}-->$fo");
58
+ print("$TrainData{$tag}->$TrainData{$data}->$TrainData{$det}-->$f\n");
44
59
  }
45
60
  }
46
61
  }
47
62
  }
48
63
 
64
+ sub mkDataHash {
65
+ my($csv_name)=shift(@_);
66
+ open(my $IN,$csv_name);
67
+ my $data_utf8=<IN>;
68
+ my @Tag=split(/\t/,decode_utf8($data_utf8));
69
+ my %TrainData;
70
+ chomp($data_utf8);
71
+ while(my $data_utf8=<$IN>) {
72
+ chomp($data_utf8);
73
+ my @Data=split(/\t/,decode_utf8($data_utf8));
74
+ my $det=pop(@Data);
75
+ my $i;
76
+ for($i=0; $i<=$#Data; $i++)
77
+ {
78
+ my $tag = $Tag[$i];
79
+ my $data = $Data[$i];
80
+ $TrainData{$tag}->{$data}->{$det}++;
81
+ }
82
+ }
83
+ close($IN);
84
+ return %TrainData;
85
+ }
49
86
  ```
50
87
  ### 試したこと
51
- 配列でなければpop関数が使えないことに気づいたので新たに@list関数を追加しました。また, それに伴ってタブで区切られているところをsplit関数で表現してみました。
88
+ 配列でなければpop関数が使えないことに気づいたので新たに@list関数を追加しました。また, それに伴ってタブで区切られているところをsplit関数で表現してみました。ファイルの読み込みが以前実行したときにはできていなかったので, やり方を調べて修正しました。ファイルの読み込みと同じ要領でfor文を利用してtagとdataを処理してみました。
52
89
  ### 補足情報
53
90
  Ubuntu-20.04を利用しています。
54
91