PHP разбор файла - проблемы с последним элементом в строке - PullRequest
0 голосов
/ 08 мая 2020

У меня есть текстовый файл на сервере, созданный в результате экспорта базы данных. Я не могу контролировать этот файл. Я пытаюсь разобрать его в PHP, чтобы получить некоторые данные для отображения на веб-странице. Когда я пытаюсь найти последний элемент в строке, он не может его найти.

Вот часть текстового файла:

ERMHDR  8.2 2017-02-02  Project admin   Primavera Admin dbxDatabaseNoName   Project Management  USD
%T  CURRTYPE
%F  curr_id decimal_digit_cnt   curr_symbol decimal_symbol  digit_group_symbol  pos_curr_fmt_type   neg_curr_fmt_type   curr_type   curr_short_name group_digit_cnt base_exch_rate
%R  1   2   $   .   ,   #1.1    (#1.1)  Dollar  USD 3   1
%R  10  2   $   .   ,   #1.1    (#1.1)  Argentine Peso  ARS 3   3.077
%R  11  2   A$  .   ,   #1.1    (#1.1)  Australian Dollar   AUST    3   1.208
%R  13  2   R$  .   ,   #1.1    (#1.1)  Brazilian Real  BRL 3   2.014
%R  14  2   £   .   ,   #1.1    (#1.1)  British Pound   U.K.    3   0.501762
%R  15  2   CA$ .   ,   #1.1    (#1.1)  Canadian Dollar CAD 3   1.10573
%R  16  2   Y   .   ,   #1.1    (#1.1)  Chinese Yuan    CNY 3   7.694
%R  17  2   €   .   ,   #1.1    (#1.1)  EURO    EUR 3   0.739088
%R  20  2   HK$ .   ,   #1.1    (#1.1)  Hong Kong Dollar    HKD 3   7.81967
%R  21  2   Rs  .   ,   #1.1    (#1.1)  Indian Rupee    INR 3   40.67
%R  23  2   ¥   .   ,   #1.1    (#1.1)  Japanese Yen    JPY 3   120.167
%R  24  2   K   .   ,   #1.1    (#1.1)  Korean Won  KRW 3   924.743
%R  25  2   N$  .   ,   #1.1    (#1.1)  Mexican Peso    MXN 3   10.7938
%R  26  2   R   .   ,   #1.1    (#1.1)  Russian Rouble  RUB 3   25.8085
%R  28  2   Sk  .   ,   #1.1    (#1.1)  Swedish Krona   SEK 3   6.80579
%R  29  2   kr  .   ,   #1.1    (#1.1)  Swiss Franc CHF 3   1.21864
%R  30  2   NIS .   ,   #1.1    (#1.1)  Israel Shekel   ILS 3   3.96384

Это отлично работает. Он находит строку со вторым значением «10» и возвращает номер строки.

<?php
    $txt_file    = file_get_contents('sandbox/uploads/sample3.xer');
    $rows        = explode("\n", $txt_file);
    array_shift($rows);

    foreach($rows as $row => $data)
    {
        $row_data = explode("\t", $data);

        if($row_data[1] == "10"){ //THIS IS THE LINE GIVING ME PROBLEMS
            echo 'Row #: ';
            echo $row;
            echo '     ';
            echo $row_data[1];
            echo '<br>';
        }
    }
?>

Однако, если я изменю указанную строку на эту, это не сработает.

if($row_data[1] == "CURRTYPE"){

Я думаю, проблема в том, что когда я взорвал файл, я каким-то образом помещал специальный символ в конец каждой строки, и мне нужно включить этот символ в мой оператор if, но я не могу понять, что это за специальный символ . Я пробовал добавить пробел, \ n, \ t.

Кто-нибудь может помочь ???

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Используйте trim, чтобы удалить любые дополнительные символы в начале или конце строки (например, пробел).

if (strcasecmp(trim($row_data[1]), 'currtype') === 0)
1 голос
/ 08 мая 2020

Попробуй прочитать с файлом. Это превратит каждую строку в массив. Я попробовал это с вашей текстовой частью и получил все строки. и с explode ('', СТРОКА, КОТОРАЯ ВЫ ХОТИТЕ); даст вам каждое слово в этой строке

$test_file = file('sample3.xer');
$line_4 = $test_file[4];
$string_line = explode(' ', $line_4);
foreach ($string_line as $k => $v) {
if (!empty($v)) echo $v.'<br>';
}
...