Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

[VBS] Kopiowanie wierszy z pliku tekstowego



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Inne języki skryptowe, przetwarzanie danych
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
jankos



Dołączył: 01 Lip 2015
Posty: 11

PostWysłany: Pią Sie 07, 2015 2:14 pm  OP    Temat postu: [VBS] Kopiowanie wierszy z pliku tekstowego Odpowiedz z cytatem Pisownia

Witam,
Mam plik tekstowy, który ma 1400 wierszy. Muszę podzielić go na mniejsze (nierówne) kawałki. W tym pliku znajdują się unikalne wiersze (np. w wierszu 1: dom, w wierszu 380: kot, w wierszu 1030: pies). Na tej podstawie chciałbym podzielić ten duży plik na 3 mniejsze. W pierwszym mniejszym pliku, żeby były linie od wiersza 1 do 379, w drugim od 380 do 1029, a w trzecim od 1030 do 1400. Czy jest możliwość wykonania czegoś takiego?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
samolot



Dołączył: 26 Sty 2006
Posty: 8316
Skąd: Toruń

PostWysłany: Pią Sie 07, 2015 7:56 pm      Temat postu: Odpowiedz z cytatem Pisownia

To, o co pytasz, jest jak najbardziej do zrobienia. VBS jest coraz rzadziej używany, poszukałem więc jakiegoś kursu, który podaje jakiś w miare uporządkowany zestaw instrukcji wraz z opisami: Jezyk Visual Basic Script

1. W celu wczytania pliku do programu (skryptu) )użyj instrukcjiOpen File for Input w trybie sekwencyjnym, poszukaj opisu tej instrukcji
2. Po otwarciu pliku pobieraj z niego poszczególne wiersze instrukcją LineInput
3. Każdą pobraną linię tekstu sprawdzaj instrukcją InStr(), czy zawiera ciąg dom, potem kot itd. Ta instrukcja zwraca numer kolejnego znaku w ciągu, który jest pierwszym znakiem szukanego słowa. jeśli nie znajdzie, to zwraca 0.

4. Po znalezieniu poszczególnych szukanych słów (jeśli naprawdę są unikalne w całym pliku), będziesz znał numery znaków w pliku, miejsc, gdzie występują początki szukanych słów. Możesz nestepnie wczytany plik przepisać do oddzielnych zmiennych.

5. Mając te teksty rozdzielone, możesz następnie zapisać poszczególne fragmenty tekstów ze zmiennych do osobnych plików tekstowych. W tym celi uzyj instrukcji Open File for Output.
Nazwy cytuję z pamięci, więc mogą w nich być przekłamania, dlatego wiec bez lektury kursu VBS (tego czy innego) się nie obejdzie.

_________________
Nie zadawaj bezcelowych pytań / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
jankos



Dołączył: 01 Lip 2015
Posty: 11

PostWysłany: Wto Sie 11, 2015 11:50 am  OP    Temat postu: [VBS] Kopiowanie wierszy z pliku tekstowego Odpowiedz z cytatem Pisownia

Stworzyłem coś takiego:
Kod:
Const ForReading = 1

Set szukaj = CreateObject("VBScript.RegExp")

szukaj.Pattern = "s_dz"

Set FSO = CreateObject("Scripting.FileSystemObject")
set fso=CreateObject("Scripting.FileSystemObject")

Set plik_zrodlowy = FSO.OpenTextFile("RJ_AD.txt", ForReading)
set plik_docelowy = FSO.OpenTextFile("test1.txt", 8, True)

n=1
Do Until plik_zrodlowy.AtEndOfStream
    strSearchString = plik_zrodlowy.ReadLine
    Set colMatches = szukaj.Execute(strSearchString)  
        For Each strMatch in colMatches  
    wiersz = plik_zrodlowy.ReadLine
    plik_zrodlowy.ReadAll
    Wscript.echo "Szukane słowo jest w wierszu nr: " & n
    Wscript.Echo "Wszystkich linii jest: " & plik_zrodlowy.Line
    plik_docelowy.Write wiersz
        Next
n = n + 1
Loop

plik_docelowy.Close
plik_zrodlowy.Close

Znajduje, w którym wierszu jest szukane słowo, ale nie chce zapisywać. W załączniku plik_zrodlowy (RJ_AD.txt) który ma charakterystyczne znaki: s_dz i ZAP_7D. Chciałbym, żeby wszystko co dotyczy jednej frazy było w jednym pliku a reszta w drugim.



RJ_AD.7z
 Opis:

Pobierz
 Nazwa pliku:  RJ_AD.7z
 Wielkość pliku:  319.52 KB
 Pobierano:  161 raz(y)

Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
jankos



Dołączył: 01 Lip 2015
Posty: 11

PostWysłany: Czw Sie 13, 2015 11:43 am  OP    Temat postu: Odpowiedz z cytatem Pisownia

Poprawiłem kod. Prawie działa tak jak trzeba, ale jest to prawie. Kod wygląda tak:
Kod:

Const ForReading = 1

Set FSO = CreateObject("Scripting.FileSystemObject")
set fso=CreateObject("Scripting.FileSystemObject")

Set ile_wierszy = FSO.OpenTextFile("RJ_AD.txt", ForReading)
Set plik_docelowy1 = FSO.OpenTextFile("s_dz.txt", 8, True)
Set plik_docelowy2 = FSO.OpenTextFile("zap_7d.txt", 8, True)
Set plik_docelowy3 = FSO.OpenTextFile("zz.txt", 8, True)

Do Until plik_zrodlowy.AtEndOfStream
    wiersz = plik_zrodlowy.ReadLine
    If InStr(wiersz,"Komórka:          [s_dz:") Then
        Do
            wiersz = plik_zrodlowy.ReadLine
            plik_docelowy1.Write wiersz & vbNewLine
        Loop Until (InStr(wiersz,"Komórka:          [ZAP_7D:") OR InStr(wiersz,"Komórka:          [zzz:"))
    ElseIf InStr(wiersz,"Komórka:          [ZAP_7D:") Then
        Do
            wiersz = plik_zrodlowy.ReadLine
            plik_docelowy2.Write wiersz & vbNewLine
        Loop Until (InStr(wiersz,"Komórka:          [s_dz:") OR InStr(wiersz,"Komórka:          [zzz:"))
    ElseIf InStr(wiersz,"Komórka:          [zzz:") Then
        Do
            wiersz = plik_zrodlowy.ReadLine
            plik_docelowy3.Write wiersz & vbNewLine
        Loop Until (InStr(wiersz,"Komórka:          [s_dz:") OR InStr(wiersz,"Komórka:          [ZAP_7D:"))
    End If

Loop


plik_docelowy1.Close
plik_docelowy2.Close
plik_docelowy3.Close
plik_zrodlowy.Close


Jeśli zostanie znaleziony ciąg znaków, np: "Komórka: [s_dz:" i zaczyna się zapisywanie do pliku to ten ciąg zostaje pominięty przy zapisie. Nie chce zapisać wierszy do trzeciego pliku, jeśli znajdzie ciąg znaków: "Komórka: [zzz:"



RJ_AD.7z
 Opis:

Pobierz
 Nazwa pliku:  RJ_AD.7z
 Wielkość pliku:  319.54 KB
 Pobierano:  152 raz(y)

Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
samolot



Dołączył: 26 Sty 2006
Posty: 8316
Skąd: Toruń

PostWysłany: Czw Sie 13, 2015 9:32 pm      Temat postu: Odpowiedz z cytatem Pisownia

Cytat:
Jeśli zostanie znaleziony ciąg znaków, np: "Komórka: [s_dz:" i zaczyna się zapisywanie do pliku to ten ciąg zostaje pominięty przy zapisie

Dzieje się tak dlatego, że w wierszu 21 pobierasz linię tekstu poleceniem ReadLine, potem sprawdzasz w wierszu 23, że ten tekst zawiera ciąg "Komórka: [s_dz: " . I to jest w porządku, ale zamiast zapisać do pliku tę linie tekstu , to ty w wierszu kodu nr 26 pobierasz następną linie tekstu i zapis do pliku zaczynasz od tej następnej, zamiast od tej poprzedniej, w której kod znalazł ciąg "Komórka: [s_dz:"
Usuń więc lub zakomentuj wiersz kodu nr 26 i uruchom skrypt i tekst powinien być zapisany poczawszy od tej linii tekstu, w której wykryłeś szukany ciąg

_________________
Nie zadawaj bezcelowych pytań / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
jankos



Dołączył: 01 Lip 2015
Posty: 11

PostWysłany: Wto Sie 18, 2015 8:35 am  OP    Temat postu: [VBS] Kopiowanie wierszy z pliku tekstowego Odpowiedz z cytatem Pisownia

Dzięki za podpowiedzi. Cały kod działa elegancko. Zapisuje wszystko tak jak trzeba. Ale na koniec wyskakuje błąd "Próba zapisu poza końcem pliku". Niby to w niczym nie przeszkadza, ale dobrze byłoby się tego pozbyć. Kod wygląda tak:
Kod:
Const ForReading = 1

Set FSO = CreateObject("Scripting.FileSystemObject")
set fso=CreateObject("Scripting.FileSystemObject")

Set ile_wierszy = FSO.OpenTextFile("RJ_AD.txt", ForReading)
Set plik_docelowy1 = FSO.OpenTextFile("s_dz.txt", 8, True)
Set plik_docelowy2 = FSO.OpenTextFile("zap_7d.txt", 8, True)
Set plik_docelowy3 = FSO.OpenTextFile("zzz.txt", 8, True)
Set plik_docelowy40 = FSO.OpenTextFile("smieci.txt", 8, True)

Set plik_zrodlowy = FSO.OpenTextFile("RJ_AD.txt", ForReading)

i=1
Do Until ile_wierszy.AtEndOfStream
    wiersz = ile_wierszy.ReadLine
i=i+1
Loop    
'Wscript.Echo "Wszystkich linii jest: " & i                    

n=1
Do Until plik_zrodlowy.AtEndOfStream
    If (InStr(wiersz,"Komórka:          [s_dz:")) Then
        linia="s_dz"
    ElseIf (InStr(wiersz,"Komórka:          [ZAP_7D:")) Then
        linia="zap_7d"
    ElseIf (InStr(wiersz,"Komórka:          [zzz:")) Then
        linia="zzz"
    Else
        linia="smieci"
    End If
    Select Case linia
        Case "s_dz"
            Do
                plik_docelowy1.Write wiersz & vbNewLine
                wiersz = plik_zrodlowy.ReadLine
                n=n+1
            Loop Until ((InStr(wiersz,"Komórka:          [ZAP_7D:")) OR (InStr(wiersz,"Komórka:          [zzz:")))
        Case "zap_7d"
            Do
                plik_docelowy2.Write wiersz & vbNewLine
                wiersz = plik_zrodlowy.ReadLine
                n=n+1
            Loop Until ((InStr(wiersz,"Komórka:          [s_dz:")) OR (InStr(wiersz,"Komórka:          [zzz:")))
        Case "zzz"
            Do
                plik_docelowy3.Write wiersz & vbNewLine
                wiersz = plik_zrodlowy.ReadLine
                n=n+1
            Loop Until ((InStr(wiersz,"Komórka:          [s_dz:")) OR (InStr(wiersz,"Komórka:          [ZAP_7D:")))
        Case "smieci"
            plik_docelowy40.Write wiersz & vbNewLine
            wiersz = plik_zrodlowy.ReadLine
        Case Else
            'Wscript.Echo "smieci "
    End Select
n=n+1
Loop
'Wscript.Echo "wyjscie w wierszu: " & n
    
plik_docelowy1.Close
plik_docelowy2.Close
plik_docelowy3.Close
plik_docelowy40.Close
plik_zrodlowy.Close
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
jankos



Dołączył: 01 Lip 2015
Posty: 11

PostWysłany: Czw Sie 20, 2015 7:49 am  OP    Temat postu: [VBS] Kopiowanie wierszy z pliku tekstowego Odpowiedz z cytatem Pisownia

Już jest wszystko OK. Zamykam temat
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
jankos



Dołączył: 01 Lip 2015
Posty: 11

PostWysłany: Pią Wrz 11, 2015 12:55 pm  OP    Temat postu: [VBS] Kopiowanie wierszy z pliku tekstowego Odpowiedz z cytatem Pisownia

Problem rozwiązałem w ten sposób. Działa dobrze
Kod:

Const ForReading = 1

Set FSO = CreateObject("Scripting.FileSystemObject")
set fso=CreateObject("Scripting.FileSystemObject")

Set ile_wierszy = FSO.OpenTextFile("RJ_AD.txt", ForReading)
Set plik_docelowy1 = FSO.OpenTextFile("001.txt", 8, True)
Set plik_docelowy2 = FSO.OpenTextFile("002.txt", 8, True)
Set plik_docelowy3 = FSO.OpenTextFile("003.txt", 8, True)
Set plik_docelowy4 = FSO.OpenTextFile("004.txt", 8, True)
Set plik_docelowy5 = FSO.OpenTextFile("005.txt", 8, True)
Set plik_docelowy6 = FSO.OpenTextFile("006.txt", 8, True)
Set plik_docelowy7 = FSO.OpenTextFile("007.txt", 8, True)
Set plik_docelowy8 = FSO.OpenTextFile("008.txt", 8, True)
Set plik_docelowy9 = FSO.OpenTextFile("009.txt", 8, True)
Set plik_docelowy10 = FSO.OpenTextFile("010.txt", 8, True)

Set plik_zrodlowy = FSO.OpenTextFile("RJ_AD.txt", ForReading)

i=1
Do Until ile_wierszy.AtEndOfStream
    wiersz = ile_wierszy.ReadLine
i=i+1
Loop                        

n=1

wiersz = plik_zrodlowy.ReadLine
linia="000"
Do Until plik_zrodlowy.AtEndOfStream
    wiersz1=""
    wiersz2=""
    If Mid(wiersz,8,1)=" " and mid(wiersz,9,1)<>" " and InStr(wiersz,"/")>61 Then  
            'wiersz2=mid(wiersz,61,80)
            'wiersz=mid(wiersz,1,60)
            wiersz=mid(wiersz,61,80)
            wiersz2=mid(wiersz,1,60)
        End If
  if not (Mid(wiersz,1,1)<>" " or InStr(Wiersz,"Funkcja:")<>0 or InStr(Wiersz,"/")<>0) Then
    Wiersz=""
    Wiersz2=""
  End If
    If (InStr(wiersz,"Komórka:          [001:")) Then
        linia="001"
    ElseIf (InStr(wiersz,"Komórka:          [002:")) Then
        linia="002"
    ElseIf (InStr(wiersz,"Komórka:          [003:")) Then
        linia="003"
    ElseIf (InStr(wiersz,"Komórka:          [004:")) Then
        linia="004"
    ElseIf (InStr(wiersz,"Komórka:          [005:")) Then
        linia="005"
    ElseIf (InStr(wiersz,"Komórka:          [006:")) Then
        linia="006"
    ElseIf (InStr(wiersz,"Komórka:          [007:")) Then
        linia="007"
    ElseIf (InStr(wiersz,"Komórka:          [008:")) Then
        linia="008"
    ElseIf (InStr(wiersz,"Komórka:          [009:")) Then
        linia="009"            
    ElseIf (InStr(wiersz,"Komórka:          [010:")) Then
        linia="010"    
    End If

  if (wiersz<>"") Then
    Select Case linia
      Case "001"
          plik_docelowy1.Write wiersz & vbNewLine
      Case "002"
        plik_docelowy2.Write wiersz & vbNewLine
      Case "003"
          plik_docelowy3.Write wiersz & vbNewLine
      Case "004"
          plik_docelowy4.Write wiersz & vbNewLine
      Case "005"
          plik_docelowy5.Write wiersz & vbNewLine
      Case "006"
          plik_docelowy6.Write wiersz & vbNewLine
      Case "007"
          plik_docelowy7.Write wiersz & vbNewLine
      Case "008"
          plik_docelowy8.Write wiersz & vbNewLine
      Case "009"
          plik_docelowy9.Write wiersz & vbNewLine
      Case "010"
          plik_docelowy10.Write wiersz & vbNewLine
      Case Else
    End Select
  End If
  n=n+1
    wiersz = plik_zrodlowy.ReadLine
Loop
            
plik_docelowy1.Close
plik_docelowy2.Close
plik_docelowy3.Close
plik_docelowy4.Close
plik_docelowy5.Close
plik_docelowy6.Close
plik_docelowy7.Close
plik_docelowy8.Close
plik_docelowy9.Close
plik_docelowy10.Close
'plik_docelowy40.Close
plik_zrodlowy.Close

strWiadomosc=MsgBox("Operacja wykonana!",64,"")

Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Inne języki skryptowe, przetwarzanie danych Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.15492 sekund, zapytan = 13
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |