PHP sscanf не печатает первую строку в файле, но следующие строки

У меня есть куча файлов с данными, отформатированными следующим образом:
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 содержит в себе вторую строку данных, как и должно быть, так почему он не читает отсканировать и распечатать первую строку файла?

0

Решение

Я полагаю, что это происходит потому, что в начале ваших файлов есть «Порядок следования байтов».
Вы должны проверить это и заменить его или удалить его из файлов.

Вот что сработало для меня:

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);

Надеюсь, поможет.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]