回答編集履歴
4
コードの解説を追加
answer
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
```php
|
3
3
|
<pre>
|
4
4
|
<?php
|
5
|
-
$dat = [];
|
5
|
+
$dat = []; // データ保持用配列の初期化
|
6
|
-
$tsv = file('340542.tsv');
|
6
|
+
$tsv = file('340542.tsv'); // ファイルからデータを行単位の配列データとして読み込み
|
7
7
|
|
8
|
-
foreach ($tsv as $line) {
|
8
|
+
foreach ($tsv as $line) { // 行単位のデータを順次処理
|
9
|
-
$line = chop($line);
|
9
|
+
$line = chop($line); // 行末の改行コードを除去
|
10
|
-
$arr = explode("\t", $line);
|
10
|
+
$arr = explode("\t", $line); // データの区切り文字TABを基準に配列に分解
|
11
|
-
$id = $arr[0];
|
11
|
+
$id = $arr[0]; // id値として1つ目のデータを採用
|
12
|
-
$dat[$id] = $arr;
|
12
|
+
$dat[$id] = $arr; // $datに格納
|
13
13
|
}
|
14
14
|
echo '=== 加工前 ===' . PHP_EOL;
|
15
15
|
var_dump($dat);
|
@@ -22,11 +22,11 @@
|
|
22
22
|
var_dump($dat);
|
23
23
|
echo '=== 加工後 ===' . PHP_EOL;
|
24
24
|
|
25
|
-
$fp = fopen('340542_out.tsv', 'w');
|
25
|
+
$fp = fopen('340542_out.tsv', 'w'); // 出力先ファイルをオープン
|
26
|
-
foreach ($dat as $arr) {
|
26
|
+
foreach ($dat as $arr) { // 行単位のデータを順次処理
|
27
|
-
fputs($fp, implode("\t", $arr) . PHP_EOL);
|
27
|
+
fputs($fp, implode("\t", $arr) . PHP_EOL); // 逆のこと:TABで1行分のデータを連結し、行末に改行コードを付与して、ファイルに出力
|
28
28
|
}
|
29
|
-
fclose($fp);
|
29
|
+
fclose($fp); // ファイルをクローズして保存
|
30
30
|
|
31
31
|
?></pre>
|
32
32
|
```
|
3
見直し
answer
CHANGED
@@ -178,4 +178,12 @@
|
|
178
178
|
配列を配列データのままfwriteにわたすと、
|
179
179
|
配列から文字列への自動変換が起こり、
|
180
180
|
次回読み込むための構造と全く違う構造で書き込んでしまい、
|
181
|
-
つまりは破壊してしまいます。
|
181
|
+
つまりは破壊してしまいます。
|
182
|
+
|
183
|
+
ファイルに直接配列を書き出すことはできない、と考えてください。
|
184
|
+
人間が読んで理解できるテキストファイルは文字列データなので、
|
185
|
+
配列データをどーにかこーにかして文字列データに連結しないとファイルになりません。
|
186
|
+
配列の要素と要素の区切りをどうするか、
|
187
|
+
1行分のデータと1行分のデータの区切りをどうするか、
|
188
|
+
ルールを決めて読み書きしているわけです。
|
189
|
+
それを無視してfwrite()に配列ドーンじゃ無理です。
|
2
加筆
answer
CHANGED
@@ -169,4 +169,13 @@
|
|
169
169
|
|
170
170
|
質問はありますか?
|
171
171
|
tsvっていう拡張子を使ったファイルは、データの区切りにTABコードを使ったものです。
|
172
|
-
真似して打ち込むときは、TABキーを押して入力してください。
|
172
|
+
真似して打ち込むときは、TABキーを押して入力してください。
|
173
|
+
|
174
|
+
---
|
175
|
+
|
176
|
+
> log.txtの中が初期化されてしまいます、なぜでしょう。
|
177
|
+
|
178
|
+
配列を配列データのままfwriteにわたすと、
|
179
|
+
配列から文字列への自動変換が起こり、
|
180
|
+
次回読み込むための構造と全く違う構造で書き込んでしまい、
|
181
|
+
つまりは破壊してしまいます。
|
1
見直し
answer
CHANGED
@@ -15,6 +15,7 @@
|
|
15
15
|
var_dump($dat);
|
16
16
|
echo '=== 加工前 ===' . PHP_EOL;
|
17
17
|
|
18
|
+
// 2で始まる行の4番目の数値を+1している
|
18
19
|
$dat[2][3] = strval(intval($dat[2][3]) + 1);
|
19
20
|
|
20
21
|
echo '=== 加工後 ===' . PHP_EOL;
|
@@ -166,4 +167,6 @@
|
|
166
167
|
> }
|
167
168
|
> === 加工後 ===
|
168
169
|
|
169
|
-
質問はありますか?
|
170
|
+
質問はありますか?
|
171
|
+
tsvっていう拡張子を使ったファイルは、データの区切りにTABコードを使ったものです。
|
172
|
+
真似して打ち込むときは、TABキーを押して入力してください。
|