質問編集履歴
1
csvファイルの読み込みができていなかったのでファイルの読み込みのやり方を参考に修正しました。
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
|
-
|
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
|
-
|
49
|
+
my %TrainData=mkDataHash("test.csv");
|
33
|
-
|
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 $f
|
57
|
+
my $f = $TrainData{$tag}->{$data}->{$det};
|
43
|
-
print("$TrainData{$tag}->$TrainData{$data}->$TrainData{$det}-->$f
|
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
|
|