Práce s *.txt   zodpovězená otázka

VB.NET

Dobrý den.

Potřeboval bych prosím poradit.

Chtěl bych udělat něco jako logování do TXT souboru.

Jenže mám problém, že neumim zapisovat na poslední řádek, ale vždy se mi přepíše první. Nevíte v čem mam chybu, nebo spíš prosím poraďte ja takový zápis řešit.

        Dim LOGW As New IO.StreamWriter("test.txt")
        LOGW.Write(Label1.Text & Environment.NewLine & "  " & Label1.Text & " " & System.DateTime.Now)
        LOGW.ToString()
        LOGW.Close()

Prostě potřebuju, aby při každém otevření souboru test.txt, se zapisovalo na poslední řádek a pokračovalo se :)

Dále by mi pomohla rada jak načíst určitý řádek ze souboru.

Třeba vím že chci načíst řádek 528 :) a zobrazit ho v label4.text.

Moc díky za radu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

teď se dívam, že ten příkla co jsem poslal je už jeden z pokusů (tak se nenechte zaskočit nesmyslností zápisu)

Díky Bouda

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravím Vás.

Tak předně - pokud do příspěvku vypisujete kód programu, zkuste jej obalit příslušným formátem (tlačítko VBcode) - je to potom mnohem čitelnější.

Za další doporučuji (zvláště v začátcích) využívat na maximum intellisense, které má visual studio velice dobře propracované. Komkrétně ve Vašem případě, pokud napíšete

Dim logw As New IO.StreamWriter(

tak Vám intellisence dá najevo, že se jedná o metodu přetíženou, tzn. že existuje více variant parametrů, které této metodě můžete předat. A pokud si nabízené možnosti prohlédnete, již sám určitě zjistíte, že krom Vámi použité varianty, kdy předáte pouze název souboru, existuje i varianta doplněná o přepínač, má-li se soubor (v případě, že existuje) přepsat, nebo se má to co vypisujete připojit na konec původního obsahu. Jinak řečeno, bude to vypadat asi takto

Dim logw As New IO.StreamWriter("test.txt", True)

, a pak se Vám to nebude přepisovat.

K poslednímu dotazu - obávám se, že budete muset číst obsah souboru po jednotlivých řádcích a současně si řádky počítat, a až dojdete na požadovanou pozici tak načtený text využít dle potřeb.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Jen bych dodal k tomu počítání řádků. Osobně bych doporučil dva způsoby. Prvním jest načíst nejdříve všechny do paměti. Díky tomu se pak mezi nimi můžete rychle pohybovat.

Druhý je vytvoření tzv. indexu. Ale to Vám prozatím nedoporučuji, je to o dost složitější.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

OK :) Až budu mít chvilku doma volno pokuím se to nějak vyzkoušet.

Děkuji za odpověď.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky za odpověď, jdu to vyzkoušet....

Super, tak jsem to vyzkoušel a moc díky za radu, taková maličkost a zkazila mi náladu na celé dopoledne :))))))

S programováním si je pohrávam a nemam moc času se tomu naplno věnovat.

Dále bych se chtěl zeptat jak načtu xtý řádek z textu třeba do label1.text

Nebo lépe prohledám text, dokud se tam neobjeví podmínka. - Vrátí mi číslo řádku a vypíše řádek.

A zapsání textu na přímo stanovený řádek.

(Stačí mi jen popostrčit jaké funkce mam použít a pokusim se dal na to přijít sám :))

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pro ten první úkol (načtení n-tého řádku z textu) je několik cest. Bohužel Vám nejsem schopen říci, která je nejlepší.

Ta nejjednodušší je asi přes rozporcování textu na jednotlivé řádky a pak výběr toho odpovídajícího.

mohlo by to vypadat třeba takhle:

dim veta As String = "první řádek" & vbCrLf & "druhý řádek" & vbCrLf & "třetí řádek" & vbCrLf & "čtvrtý řádek"
  
Dim texty() As String = veta.Split(CChar(vbCrLf))
MsgBox(texty.Length)            ' vypíše počet řádků v textu veta
MsgBox(texty(1))                ' vypíše 2. řádek z textu
 

nebo určitě by to šlo řešit přes regulární výrazy. Např. pro výpis třetího řádku stačí zadat něco podobného tomudle:

Dim r As New Regex("(.*\n){2}(?<cosi>.*$)", RegexOptions.Multiline)
MsgBox(r.Match(veta).Groups("cosi").ToString)

(ta "dvojka" ve složených závorkách udává právě číslo požadovaného řádku (číslováno od 0).

Konkrétně ty regulární výrazy by mohly být pro Vás zajímavé i s ohledem na další požadavky, protože byste v něm mohl v jednom kroku vyhledat i ten Váš případný klíč)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

:)

Tak co jsem potřeboval zatím funguje.

Tohle je na mě už dost složíté (ale pokusím se to otestovat)

Dim r As New Regex("(.*\n){2}(?<cosi>.*$)", RegexOptions.Multiline)
MsgBox(r.Match(veta).Groups("cosi").ToString)

Díky Bouda

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máte pravdu - je to složité jak dvoják žebř ;-) , ale zase na druhou stranu jsou regulární výrazy velice mocná a zajímavá zbraň (umí toho opravdu hodně). Sám jsem s nimi ještě nedělal a v tom Vašem případě jsem to jen tak letmo zkoušel (za vydatné pomoci tohoto textu http://msdn2.microsoft.com/en-us/library... ) - až budu v důchodu a budu mít na to čas (:-)), budu si to muset celé nastudovat.

Jinak jsem to nějak opomněl minule zdůraznit, pokud si s tím budete hrát, nezapomeňte do projektu naimportovat příslušný jmenný prostor

Imports System.Text.RegularExpressions

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback