Autor Zpráva
Nikitaa
Profil *
Zdravím.Jak vyřešit následující problém? Mám v PC tisíce souborů .txt . Potřebuji z každého zkopírovat prvních 558 znaků jinam. Jak to udělat? Mám win 10.

Prostě otevřít soubot .txt, zkopírovat 558 znaků a zavřít. A takto všechny soubory.
Keeehi
Profil
Dá se to vyřešit třeba s PHP, pokud ho máš nainstalované.
K zjištění jména souboru ve složce slouží třeba funkce scandir nebo glob. Získané pole souborů můžeš projít pomocí foreach. K získání obsahu souboru můžeš potom použít třeba file_get_contents. Jeho posledním parametrem se dá omezit délka načítaného řetězce na 558 bajtů. Záleží na kódování souboru, zda to odpovídá i 558 znakům ale tebe stejně spíš asi zajímají bajty.
Nikitaa
Profil *
Tak to dohromady nikdy nedám.
Keeehi
Profil
Zas tak složité to není
<?php
$path = "cesta/ke/slozce/se/soubory";

$full = '';
foreach (glob("$path/*.txt") as $filename) {
    $full .= file_get_contents($filename,  false, null, 0, 558)."\n";
}
file_put_contents('results.txt', $full);
Nikitaa
Profil *
Já se ještě zeptám. Bude to fungovat i tak aby to ve složce 1 otevřelo soubor text1.txt a zkopírovalo do složky 2 do souboru text1.txt?
To už bych asi chtěla moc že? Problém je že těch souborů je 600 a potřebuju to každý den takto udělat. Z txt1 do txt1, z txt2 do txt2 atd... Vždy 855 znaků.
Keeehi
Profil
Ani to není problém
<?php
$path_in = "cesta/ke/slozce/se/soubory";
$path_out = "cesta/ke/slozce/s/vysledky";

foreach (glob("$path_in/*.txt") as $filename) {
    $part = file_get_contents($filename,  false, null, 0, 558);
    file_put_contents("$path_out/".basename($filename), $part);
}
juriad
Profil
S prostředky linuxího shellu (potřeba do windows doinstalovat cygwin, mingw, či git bash) to lze jednoduše udělat takto:
find cesta-ke-zdroji -iname '*.txt' | xargs -I '{}' sh -c 'head -c 588 {} > cesta-k-cili/`basename {}`'
Nikitaa
Profil *
Mám to takto:

<?php
$path_in = "pokus/1/1";
$path_out = "pokus/2/2";
 
foreach (glob("$path_in/*.txt") as $filename) {
    $part = file_get_contents($filename,  false, null, 0, 558);
    file_put_contents("$path_out/".basename($filename), $part);
}


Ze souboru 1.txt do souboru 2.txt to ale nenakopíruje nic.
Keeehi
Profil
Nikitaa:
Takhle to ale nefunguje. Počítá to s tím, že v $path_in je složka*. Z ní to vybere všechny soubory, všechny je projde a do složky $path_out uloží výsledek do stejně pojmenovaných souborů.
* Co co tam máš ty vypadá jako cesta se složkou a kusem názvu souboru.

Přidal jsem ti tam část na kontrolu existence těch složek. Takto budeš vědět, zda máš cestu dobře. A taky výpis, kolik souborů se tam našlo.
<?php
$path_in = "pokus/1";
$path_out = "pokus/2";

if (!is_dir($path_out)) {
    echo "Složka $path_in neexistuje.<br>\n";
}

if (!is_dir($path_out)) {
    echo "Složka $path_in neexistuje.<br>\n";
}


if (!is_dir($path_out) || !is_dir($path_out)) {
    echo "Skript ukončen.<br>\n";
    exit;
}

$files = glob("$path_in/*.txt");
echo "Ve složce $path_in/ bylo nalezeno ".count($files)." textových souborů.";

foreach ($files as $filename) {
    $part = file_get_contents($filename,  false, null, 0, 558);
    file_put_contents("$path_out/".basename($filename), $part);
}

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0