teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

コードの解説を追加

2021/05/27 08:24

投稿

退会済みユーザー
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

見直し

2021/05/27 08:24

投稿

退会済みユーザー
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

加筆

2021/05/27 07:31

投稿

退会済みユーザー
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

見直し

2021/05/27 07:26

投稿

退会済みユーザー
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キーを押して入力してください。