У меня есть куча файлов с данными, отформатированными следующим образом:
INT | INT | строка | строка
У меня есть некоторые функции, чтобы получить все файлы в каталоге, отформатировать их имена и сделать из них выпадающее меню выбора.
Из этого пользователь выбирает файл, который он хочет открыть.
Выбранный файл (его имя) отправляется через POST во второй php-файл, который открывается в iframe прямо под выпадающей формой.
Это соответствующее содержимое указанного файла:
<table>
<thead>
<tr>
<th>A:</th>
<th>B:</th>
<th>C:</th>
</tr>
</thead>
<tbody>
<?php
$fl = $_POST["file"];
$currentfile = fopen("./dir/$fl","r");
if ($currentfile) {
while (($line = fgets($currentfile)) !== false) {
$n = sscanf($line, "%d|%d|%[^|]|%[^\n]", $a,$b,$c,$d);
print "<tr><td>$a</td><td>$b</td><td>$d</td></tr>";
}
fclose($currentfile);
} else {
print "Error: Couldn't open file.<br>";
}
?>
</tbody>
</table>
Так или иначе, первая строка в каждом файле не отображается в таблице, сгенерированной этим, все остальное в порядке.
Как пример, вот один файл.
1|334|Item 1
2|837|Item 2
3|321|Item 3
4|124|Item 4
5|331|Item 5
etc...
И это вывод, который я получаю.
A: B: C:
2 837 Item 2
3 321 Item 3
4 124 Item 4
5 331 Item 5
etc...
Или в коде:
<table>
<thead>
<tr>
<th>A:</th>
<th>B:</th>
<th>C:</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>2</td>
<td>837</td>
<td>Item 2</td>
</tr>
<tr>
<td>3</td>
<td>321</td>
<td>Item 3</td>
</tr>
<tr>
<td>4</td>
<td>124</td>
<td>Item 4</td>
</tr>
<tr>
<td>5</td>
<td>331</td>
<td>Item 5</td>
</tr>
etc...
</tbody>
</table>
Как видно из приведенного выше кода, теги td печатаются, но в них нет данных, тогда как второй набор тегов td содержит в себе вторую строку данных, как и должно быть, так почему он не читает отсканировать и распечатать первую строку файла?
Я полагаю, что это происходит потому, что в начале ваших файлов есть «Порядок следования байтов».
Вы должны проверить это и заменить его или удалить его из файлов.
Вот что сработало для меня:
while (($line = fgets($currentfile)) !== false) {
$bom = pack('H*','EFBBBF');
$line = preg_replace("/^$bom/", '', $line);
$n = sscanf($line, "%d|%d|%[^|]|%[^\n]", $a, $b, $c, $d);
print "<tr><td>$a</td><td>$b</td><td>$c</td></tr>";
}
Возможно, этот код не работает в вашей системе, и вам нужно попробовать другой код для удаления спецификации.
Попробуйте также это:
$line = str_replace("\xEF\xBB\xBF",'',$line);
Надеюсь, поможет.
Других решений пока нет …