Как мне отредактировать несколько файлов .txt с разными именами в папке? - PullRequest
0 голосов
/ 09 марта 2020

У меня есть папка, содержащая несколько файлов .txt, которая называется:

A500_1.txt

A500_2.txt

A700_1.txt

A700_2.txt

A900_1.txt

...

В каждом из файлов .txt есть:

PRXC1_|TB|CCAAO9-RC|9353970324463|24.99

PRXC1_|TB|CFEXK4-RC|9353970294766|84.99

PRXC1_|TB|CFEXK4-RC|9353970294773|84.99

...

Я бы хотел, чтобы вы:

  • , если имя файла начинается с A500_, заменить "TB" на "MD"

  • , если имя файла начинается с A700_, заменить "TB" на " JB "

  • , если здесь указано, что имя исходного кода файла начинается с A900_, заменить" TB "на" LD "

Я написал эту функцию, но она просто создает мне пустой файл A500_2.TXT в root проекта и отображает:

Warning: file_get_contents(A500_2.TXT): failed to open stream:

Где моя ошибка?

<?php

function processFile( $path ) {

   $dir    = './test/';
   $allFiles = scandir($dir);

   foreach($allFiles as $file) {

       $filename = basename( $file );

        if ( ! in_array($file,array(".","..")))
      { 

       //read the entire string
       $str = file_get_contents( $file );

       // var_dump($str);

       // replace something in the file string
       if ( strpos( $filename, 'A500_' ) === 0 ) {

           $str = str_replace( 'TB', 'MD', $str );

       } else if ( strpos( $filename, 'A700_' ) === 0 ) {

           $str = str_replace( 'TB', 'JB', $str );

       } else if ( strpos( $filename, 'A900_' ) === 0 ) {

           $str = str_replace( 'TB', 'LD', $str );

       } else {
           // Return false if we don't know what to do with this file
           return false;
       }

       //write the entire string    
       $writeResult = file_put_contents( $file, $str );

       //return true after a file is written successfully, or false on failure
       return $writeResult >= 0;

  }
  }
}

if(processFile( './test/' )) echo "good!";
?>

1 Ответ

0 голосов
/ 09 марта 2020

И предупреждение file_get_contents, и создание пустого файла сводятся к одной и той же проблеме - scandir возвращает только имя файла , а не относительный путь к запущенному в данный момент сценарию.

Я предполагаю, что вы ожидаете, что он возвратит относительные пути, поэтому вы звоните basename в верхней части вашего l oop. Таким образом, ваши аргументы $file и $filename всегда будут иметь одно и то же значение.

Самое быстрое решение будет заключаться в добавлении $file к имени отсканированного каталога перед обработкой чего-либо еще:

$file = $dir . $file;

Это должно исправить как вызовы чтения, так и записи.

...