回答編集履歴

4

コードの解説を追加

2021/05/27 08:24

投稿

退会済みユーザー
test CHANGED
@@ -6,21 +6,21 @@
6
6
 
7
7
  <?php
8
8
 
9
- $dat = [];
9
+ $dat = []; // データ保持用配列の初期化
10
-
10
+
11
- $tsv = file('340542.tsv');
11
+ $tsv = file('340542.tsv'); // ファイルからデータを行単位の配列データとして読み込み
12
-
13
-
14
-
12
+
13
+
14
+
15
- foreach ($tsv as $line) {
15
+ foreach ($tsv as $line) { // 行単位のデータを順次処理
16
-
16
+
17
- $line = chop($line);
17
+ $line = chop($line); // 行末の改行コードを除去
18
-
18
+
19
- $arr = explode("\t", $line);
19
+ $arr = explode("\t", $line); // データの区切り文字TABを基準に配列に分解
20
-
20
+
21
- $id = $arr[0];
21
+ $id = $arr[0]; // id値として1つ目のデータを採用
22
-
22
+
23
- $dat[$id] = $arr;
23
+ $dat[$id] = $arr; // $datに格納
24
24
 
25
25
  }
26
26
 
@@ -46,15 +46,15 @@
46
46
 
47
47
 
48
48
 
49
- $fp = fopen('340542_out.tsv', 'w');
49
+ $fp = fopen('340542_out.tsv', 'w'); // 出力先ファイルをオープン
50
-
50
+
51
- foreach ($dat as $arr) {
51
+ foreach ($dat as $arr) { // 行単位のデータを順次処理
52
-
52
+
53
- fputs($fp, implode("\t", $arr) . PHP_EOL);
53
+ fputs($fp, implode("\t", $arr) . PHP_EOL); // 逆のこと:TABで1行分のデータを連結し、行末に改行コードを付与して、ファイルに出力
54
54
 
55
55
  }
56
56
 
57
- fclose($fp);
57
+ fclose($fp); // ファイルをクローズして保存
58
58
 
59
59
 
60
60
 

3

見直し

2021/05/27 08:24

投稿

退会済みユーザー
test CHANGED
@@ -359,3 +359,19 @@
359
359
  次回読み込むための構造と全く違う構造で書き込んでしまい、
360
360
 
361
361
  つまりは破壊してしまいます。
362
+
363
+
364
+
365
+ ファイルに直接配列を書き出すことはできない、と考えてください。
366
+
367
+ 人間が読んで理解できるテキストファイルは文字列データなので、
368
+
369
+ 配列データをどーにかこーにかして文字列データに連結しないとファイルになりません。
370
+
371
+ 配列の要素と要素の区切りをどうするか、
372
+
373
+ 1行分のデータと1行分のデータの区切りをどうするか、
374
+
375
+ ルールを決めて読み書きしているわけです。
376
+
377
+ それを無視してfwrite()に配列ドーンじゃ無理です。

2

加筆

2021/05/27 07:31

投稿

退会済みユーザー
test CHANGED
@@ -341,3 +341,21 @@
341
341
  tsvっていう拡張子を使ったファイルは、データの区切りにTABコードを使ったものです。
342
342
 
343
343
  真似して打ち込むときは、TABキーを押して入力してください。
344
+
345
+
346
+
347
+ ---
348
+
349
+
350
+
351
+ > log.txtの中が初期化されてしまいます、なぜでしょう。
352
+
353
+
354
+
355
+ 配列を配列データのままfwriteにわたすと、
356
+
357
+ 配列から文字列への自動変換が起こり、
358
+
359
+ 次回読み込むための構造と全く違う構造で書き込んでしまい、
360
+
361
+ つまりは破壊してしまいます。

1

見直し

2021/05/27 07:26

投稿

退会済みユーザー
test CHANGED
@@ -32,6 +32,8 @@
32
32
 
33
33
 
34
34
 
35
+ // 2で始まる行の4番目の数値を+1している
36
+
35
37
  $dat[2][3] = strval(intval($dat[2][3]) + 1);
36
38
 
37
39
 
@@ -335,3 +337,7 @@
335
337
 
336
338
 
337
339
  質問はありますか?
340
+
341
+ tsvっていう拡張子を使ったファイルは、データの区切りにTABコードを使ったものです。
342
+
343
+ 真似して打ち込むときは、TABキーを押して入力してください。