Перезаписать фрагмент файла с помощью php?


я Не знаю, как объяснить мою проблему, поэтому я расскажу,:

Я использую PHP и хотел бы обработать файл .txt n строк. Каждая строка имеет размер по умолчанию 20 символов.

например... первые 8 символов относятся к дате отправки (ddmmaaa), 2 следующие в государство происхождения (SP, RJ, ...), 2 других в состояние, назначение, и последние 8 код продукта.

Linha 1: 01012014RJPA00001472
Linha 2: 03121997MGRS00192010
...
Linha n: 28092012AMAC00000071

То, что я хотел бы знать, как переписать один из этих терминов (не всю строку, а не весь файл) и сохранить файл.

Тип: В строке 2 файла, я хочу, чтобы изменить состояние начало MG MT без изменения других данных из файла. Например, если я взял указателя в положение до 'MG' apertasse insert на клавиатуре и, вероятно, будет введен 'MT'.

 2
php
Author: Flávio Granato, 2014-03-07

3 answers

Есть несколько способов... То, что вы просили, я считаю, что это в основном это:

<?php

// Tamanho padrão da sua linha
$linha_tamanho_default = 20;

// Array que define o inicio do valor na linha de acordo com o tipo de dado
$inicio = array(
    "DATA" => 0,
    "UF" => 8,
    "DESTINO" => 10,
    "CODIGO" => 12,
);

// Define o tamanho de cada item de acordo com o tipo de dado
$tamanho = array(
    "DATA" => 8,
    "UF" => 2,
    "DESTINO" => 2,
    "CODIGO" => 8,
);

// simulando o arquivo em uma string
// equivale a um arquivo txt com o conteudo do comentário abaixo:
/* 
01012014RJPA00001472
03121997MGRS00192010
28092012AMAC00000071
*/
$arquivo = "01012014RJPA00001472\n03121997MGRS00192010\n28092012AMAC00000071";


/***** Abaixo os parâmetros definem que a UF da 3ª linha será substituida por RJ */

// Define que TIPO de valor será substituido
$tipo = "UF";
// Define a linha que será alterada
$linha = 3;
// Define o NOVO valor
$valor = "RJ";

// Calcula a posição para a substituição
// usa $linha-1 (pois a contagem inicia em 0)
// usa $linha_tamanho_default+1 (pois inclui o \n)
// soma com o inicio do item que deseja substituir de acordo com a linha
$posicao = ($linha-1)*($linha_tamanho_default+1) + $inicio[$tipo];

// Retorna o arquivo   
$arquivo = substr_replace($arquivo, $valor, $posicao, $tamanho[$tipo] );

// Printa os resultados
echo $arquivo;

?>
 1
Author: thiagobarradas, 2014-03-07 14:13:50

Будет интересно, если вы используете регулярные выражения для этого.

Вы сказали, что ваш текстовый файл состоит из строк в следующем формате: "

  • 20 символов в каждой
  • 10 первых символов даты, не имеет значения для наших целей
  • 2 символов, следующих UF, учитывая, что мы хотим работать
  • 8 символов, следующие также не имеют значения

Таким образом, базовые регулярные выражения для каждой строки будет выглядеть так:

/^(?P<data>.*){10}(?P<uf>.*){2}(?P<etc>.*){8}$/

Подставить эти данные, просто используем функцию preg_replace:

$siglaABuscar = 'MT';
$novaSigla    = 'MG';
$arquivo      = file_get_contents('arquivo.txt');
$arquivo      = preg_replace("/^(?P<data>.*){10}(?P<uf>$siglaABuscar){2}(?P<etc>.*){8}$/g", "$1$novaSigla$3", $arquivo);
file_put_contents('arquivo.txt', $arquivo);

PS: я написал код, голову, может быть, есть некоторые настройки, которые будут сделаны.

 1
Author: Rodrigo Rigotti, 2014-03-07 12:49:54

Ниже приведены некоторые советы, которые могут помочь

Методы fopen(), fread(), fgets(), fwrite(), fclose() используются, чтобы если доступ и изменять файлы из вашего php-скрипта. http://br.php.net/manual/pt_BR/function.fopen.php

И Другой вариант "тянуть все в массив", внести изменения, а затем записать обратно в файл. (если их много проверок и изменений, может быть хорошим вариантом)

$arrayDeLinhas = file($filename, FILE_IGNORE_NEW_LINES);

Это даст вам массив строк в файл, после можно ли справиться информацию, как вы хотите.

, Здесь можно найти какой-то метод, который поможет тебе справиться с string. http://php.net/manual/pt_BR/book.strings.php

Я Считаю, что wordwrap и substr_replace должны ему помочь. Но с этого момента является организация твой алгоритм, горе с вами!

 0
Author: arturBernardo, 2014-03-07 14:14:46