logo
02.09.2019 22:10
1
Nějak mi to už nemyslí, ale potřebuji:
1. otevřít soubor
2. vyhledat řádek (podle části textu)
3. celý nalezený řádek změnit novým textem
(ne jenom část,ale celý řádek)
4. uložit soubor

Díky

Co se právě děje na Webtrhu?

02.09.2019 23:55
2
a musíš to být v php? V linuxu je na to třeba nástroj "sed".

V php to bude složitější, záleží jak ten soubor je velký, z hlavy by mohlo fungovat něco takovéhoto:

PHP kód:
<?php

$obsah 
file('cesta_k_souboru.txt');
function 
nahrad_radek($radek) {
    
$co_hledat="část řádku";
    
$cim_nahradit="nový obsah pro řádek";
    if (
stristr($radek$co_hledat)) {
        return 
"$cim_nahradit\n";
    }
    return 
$radek;
}
$novy_obsah array_map('nahrad_radek',$obsah);
file_put_contents('cesta_k_novemu_souboru.txt'implode(''$novy_obsah));
(Nezkoušel jsem to, psáno z hlavy). Každopádně cest jak toho docílit je spousta, tohle bude paměťově a výkonově velice náročné na velké soubory, u malých se to ztratí. Lepší ale na to použít specializovaný nástroj, třeba ten sed. Samozřejmě poté také záleží na kódování souboru a dalších maličkostech, lepší by bylo, kdybys sem hodil příklad.
02.09.2019 23:59
3
rychlejší variantu poradil google https://www.linuxquestions.org/quest...c-line-523519/
03.09.2019 07:27
4
Děkuji.
03.09.2019 10:07
5
Kód:
preg_match_all('/word}/m', $textfile, $matches);
03.09.2019 10:13
6
Původně odeslal kdosiodjinud
Kód:
preg_match_all('/word}/m', $textfile, $matches);
tohle ti ale najde jen řádky, které odpovídají předpisu, již ti ale neumožní je změnit, nevíš ani jejich pozici v textu (to bys musel přihodit flag PREG_OFFSET_CAPTURE) a ideálně to co hledáš escapovat přes preg_quote("word", "/"), jinak to bude házet syntax errory.
03.09.2019 15:29
7
Musí-li to být v PHP a je-li zdrojový soubor 'plain text' (a ne přehnaně velký, do desetitisíců řádků)...
PHP kód:
$lines file($filename);
foreach(
$lines as $i => $line) {
    
preg_replace($pattern$replacement$lines[$i], $limit);
}
file_put_contents($filenameimplode("\n"$lines)); 
03.09.2019 16:59
8
ak mozem, upravim podla zadania:

Kód:
3. celý nalezený řádek změnit novým textem
(ne jenom část,ale celý řádek)
Kód:
$findme = 'hladany_text';
$replace = 'nahrada riadku';

$lines = file($filename);
foreach($lines as $i => $line) {
    if ( strpos($line, $findme) !== false ) {
     $line[$i] = $replace;
     break;
    }
}
file_put_contents($filename, implode("\n", $lines));
03.09.2019 17:06
9
Původně odeslal ne
ak mozem, upravim podla zadania:

Kód:
3. celý nalezený řádek změnit novým textem
(ne jenom část,ale celý řádek)
Kód:
$findme = 'hladany_text';
$replace = 'nahrada riadku';

$lines = file($filename);
foreach($lines as $i => $line) {
    if ( strpos($line, $findme) !== false ) {
     $line[$i] = $replace;
     break;
    }
}
file_put_contents($filename, implode("\n", $lines));
drobná poznámka, funkce strpos zohledňuje velikost písmen, proto jsem ve svém kódu volil funkci stristr. Je otázka co je vhodnější varianta :)
03.09.2019 17:44
10
Btw. nezkoušel jsem ten kód - možná bych ještě otestoval, jaké zakončení řádků má ten soubor - někdy končí znakem #13, někdy #10, někdy jsou oba. Podle toho upravit $line, nebo implode().
03.09.2019 18:18
11
Děkuji všem.
Jde o klasický textový soubory o max. 300 řádcích kódu.
Vyhledávat budu podle MD5 textu.
Takže bych soubor načetl klidně do array rozdělené podle #13.

Pak by se mohlo použít při nalezení řádku např. 4
$line[4] = nový text.
03.09.2019 21:24
12
Původně odeslal TomášX
drobná poznámka, funkce strpos zohledňuje velikost písmen, proto jsem ve svém kódu volil funkci stristr. Je otázka co je vhodnější varianta :)
case insensitive je lepsia fc. stripos :)