Diskuze: Citanie v textovom subore od konca smerom na zaciatok
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 19 zpráv z 19.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
K čemu to potřebuješ ? Načti si do pole všechny řádky a pak je čti
obráceně
Potrebujem to pretoze mam nejaky textovy subor do ktoreho zapisujem nejake logy a tento subor textovy ma niekedy aj 200 MB a nechcem cely nacitat ale len od konca mozno nejakych 30 riadkov sa vratit a najst si retazec textovy co potrebujem
Můžeš to číst řádek po řádku a přeskočit tak určitou část souboru a až zbytek si ukládat do nějakého pole, které potom otočíš. Pokud víš, že třeba potřebuješ 10% souboru od konce nebo přesně víš od jakého řádku to chceš, neměl by to být problém.
Jelikož nevíš kolik bajtů má jeden záznam, tak v souboru nemůžeš skákat. Každý řádek je zakončen speciální sekvencí znaků, což označuje jeho ukončení. Jelikož nevíš kde ty sekvence jsou, můžeš číst jen shora dolů.
Ale tak neverim ze si nemozem dat vypisat dajme tomu iba piaty riadok z textoveho suboru.
Ten program tail mi len bude vypisovat to co je v textovom subore iba nijako inak z neho neviem dostat data
Již jsem ti vysvětloval proč to nejde. Pokud mi nevěříš, asi nemá smysl, abych ti tu pomáhal.
Chytrému napověz, se zatvrzelím nepohneš
btw. to je až takový problém si ten soubor načíst do pole a pak číst
od spodu? Nebo neukládej stále do toho samého souboru, aby nebyl tak velký a
pak bude počet dat potřebných ke čtení menší a už to půjde
Prý je to 200 MB log, to určitě celé ukládat nemůže. Vyřeší to tak, že bude číst od začátku a ukládat až tehdy, kdy bude řádky potřebovat.
Však výstup toho programu tail si přesměruješ do svého programu a zpracuješ dle potřeby. Běžně to tak dělám. Záleží na tom, co s tím dál chceš dělat, nekdy stačí za to dát sed či awk. Na jednom řádku vyřešeno.
No asi mas pravdu len som fakt skusal co najjednoduchsie riesenie a asi to tak nepojde mam pocit. No asi budem musiet si cely subor prehladat a vytiahnut len tie data ktore potrebujem ale problem je v tom ze sa niekedy tie operacie (logy) opakuju .... viem si po urcitom case tam dat casovu peciatku ale problem je v tom ze nemusi byt stale dobre nastaveny systemovy cas pretoze tie logy ktore mi prichadzaju niesu zo systemu.
var lineCount = File.ReadLines(pathDesktop + @"\CLI_Log_copy.txt").Count();
nieco take som nasiel na nete a ulozi to vlastne pocet riadkov do premennej. No keby som potom dekrementoval tu premennú asi by to nešlo či ?
ReadAllLines ti načte všechny řádky do pole, to je u 200 mb trochu nepraktické.
Pokud je posledním znakem \n, bude to pocet radku o jeden mensi, ale to je chybou ve StreamReaderu, ktery se snazi byt moc chytry.
static StreamReader SouborOdzadu(string soubor, int pocetRadku)
{
var stream = new FileStream(soubor, FileMode.Open);
stream.Position = Math.Max(stream.Length - 1, 0);
while (stream.Position > 0 && pocetRadku > 0)
{
int current = stream.ReadByte();
if (current == '\n')
pocetRadku--;
stream.Position = Math.Max(stream.Position - 2, 0);
}
if (pocetRadku == 0)
stream.Position = Math.Min(stream.Position + 2, stream.Length);
return new StreamReader(stream);
}
Zobrazeno 19 zpráv z 19.