Read part of the contents of the file

-2

I'm in need of some help.

I have a large .txt file that looks like this:

1000#
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.#

1001#
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.#

I want to read only the requested ID, but only the text between the tags is read.

Example, I want to fetch the value of the text 1001 . Ai would be returned this way:

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.

Here is the code I'm trying to do:

$file = "id.txt";
$f = fopen($file, 'rb');
$found = false;
while ($line = fgets($f, 1000)) {
    if ($found) {
       echo $line;
       continue;
    }
    if (strpos($line, "1000") !== FALSE) {
      $found = true;
    }
}

With it I can reach the ID value, but it reads everything down, I wanted it to stop at the end of #. That is, read the text between the #TEXTO #.

    
asked by anonymous 19.03.2018 / 11:35

2 answers

0

There are several ways to:

With regular expressions:

Search for a single record

$data = '1000#
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.#

1001#
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.#';

function buscarTexto($id, $data) {
    $re = '/(?<=^'.$id.'#\r?\n).+?(?=#$)/sm';

    return preg_match($re, $data, $match) ? $match[0] : null;
}

Brief explanation of regular expression

/
(?<=^ #Casa a linha do id registro sem capturá-la
    $id #id do registro
#\n)
.+? #Casa o texto e o captura
(?=#$) #Casa o delimitador final do texto sem capturá-lo
/smx
#o flag s faz com que o ponto capture as quebras de linhas
#o flag m faz com que os operadores ^ e $ casem o inicio e final das linhas
#o flag x não foi utilizado no código mas faz com que o espaços presentes na expressão não sejam considerados.

Load all records in an array where the key is the id.

function buscarTextos($data) {
    $re = '/(?<id>^\d+)(?:#\r?\n)(?<text>.+?)(?:#$)/sm';
    $result = [];

    if(preg_match_all($re, $data, $matches, PREG_SET_ORDER))
        //Converte o resultado da expressão em um array id => texto
        foreach($matches as $m) 
            $result[$m['id']] = $m['text'];

    return $result;
}

Brief explanation of regular expression

/
(?<id>^\d+) #Armazena id do registro em um grupo separado
(?:#\n) #Casa o delimitador do id e a quebra de linha
(?<texto>.+?) #Armazena o texto em outro grupo
(?:#$) #Casa o delimitador final do texto
/gsmx
#o flag g faz com que sejam capturadas todos os registros
#o flag s faz com que o ponto capture as quebras de linhas
#o flag m faz com que os operadores ^ e $ casem o inicio e final das linhas
#o flag x não foi utilizado no código mas faz com que o espaços presentes na expressão não sejam considerados.

No regular expressions

Read row by line and return desired record

function buscarTexto2($id, $data) {
    $rows = explode("\n", $data);
    $id = $id.'#';
    $text = '';
    $found = false;

    foreach($rows as $r) {
        //Remove possíveis espaços em branco
        $r = trim($r);

        //Verifica se a linha corresponde ao id do registro selecionado
        if($r === $id) 
            $found = true;
        //Caso tenha encontrado o registro
        elseif($found) {
            //Aqui é assumido que o texto pode ter diversas linhas
            $text .= $text == '' ? $r : PHP_EOL.$r;

            //Então caso a linha lida termine com $
            if(substr($text, -1, 1) == '#')
                //Retorna o texto
                return substr($text, 0, -1);
        }
    }
}

Read row by line and store all records in an array where the key is the id.

function buscarTextos2($data) {
    $rows = explode("\n", $data);
    $id = null;
    $text = '';
    $result = [];

    foreach($rows as $r) {
        //Remove possíveis espaços em branco
        $r = trim($r);

        //verifica se algum registro está sendo processado no momento
        if($id === null) {

            //Ignora linhas em branco caso nenhum registro esteja sendo processado no momento.
            if(!$r)
                continue;

            //Armazena o id e desconsidera o último caractere que é o $
            $id = substr($r, 0, -1);
        } else {
            //Aqui é assumido que o texto pode ter diversas linhas
            $text .= $text == '' ? $r : PHP_EOL.$r;

            //Então caso a linha lida termine com $
            if(substr($text, -1, 1) == '#') {
                //Adiciona o registro ao array
                $result[$id] = substr($text, 0, -1);

                //E se prepara para o processamento de um novo registro
                $id = null;
                $text = '';
            }
        }
    }

    return $result;
}

In all functions it has been assumed that # (hashtag) is the last character of the line.

You can test the code at the following link link

If you want to use them with the file content do the following:

$dados = file_get_contents('caminho do arquivo');

$texto = buscarTexto(1000, $dados);
//ou
$texto = buscarTexto2(1000, $dados);
//ou
$textos = buscarTextos($dados);
//ou
$textos = buscarTextos2($dados);
    
19.03.2018 / 14:34
0

To solve this problem you can use regular expressions.

As you apparently already have the id you want to read, it's pretty obvious the pattern that follows this text file (if all content is formatted that way). Soon you can write a regular expression like this:

/[valor_do_id]\$\n(.*)\$/

An example using the preg_match function of PHP would look something like this:


  $conteudo_do_arquivo = '....';
  $id = 1000;

  $matches; // vai armazenar os resultados da regex.
  preg_match("/" . $id . "\$\n(.*)\$/", $conteudo_do_arquivo, $matches);

   // [0] vai conter toda a string compativel com o regex
   // [1] vai conter apenas o valor do 1º grupo de captura, tudo entre '()'.
  print_r($matches);

You can read more about the preg_match function in the php.net

You can also use Regexr to test your expressions beforehand.

    
19.03.2018 / 13:15