🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.bazy-danych.msaccess
6 messages
6 total messages Started by karol77marchewka Sat, 19 Mar 2016 12:00
Łączenie tekstu
#137122
Author: karol77marchewka
Date: Sat, 19 Mar 2016 12:00
21 lines
1935 bytes
Mam plik tekstowy zawierający kilkadziesiąt tysięcy wierszy, np:

ABAŻUR CZERWONY
opis:cena:25,00
opis:kolor:czerwony
opis:wielkość:22cm
BIEŻNIK STOŁOWY
opis:cena:75,00
opis:wielkość:50cmx55cm
CYTRYNY
opis:cena:3,00
opis:kolor:żółty

A więc mamy nazwę towaru, a pod nim zawsze rozpoczynający się od słów "opis" charakterystykę tego towaru wyrażoną w zmiennej liczbie linii.
Ten plik tekstowy importuję do accessa, otrzymuję podobną tabelę, dodatkowo pole ID ułatwiające sortowanie i potrzebuję powyższe zamienić na taką postać:

ABAŻUR CZERWONY;opis:cena:25,00;opis:kolor:czerwony;opis:wielkość:22cm
BIEŻNIK STOŁOWY;opis:cena:75,00;opis:wielkość:50cmx55cm
CYTRYNY;opis:cena:3,00;opis:kolor:żółty

Jak się do tego zabrać ??
Re: Łączenie tekstu
#137123
Author: Prot
Date: Sat, 19 Mar 2016 20:15
38 lines
2469 bytes
Użytkownik <karol77marchewka@gmail.com> napisał w wiadomości 
news:759db8a3-fc8d-4841-a2c2-018e49b0cc41@googlegroups.com...
Mam plik tekstowy zawierający kilkadziesiąt tysięcy wierszy, np:

ABAŻUR CZERWONY
opis:cena:25,00
opis:kolor:czerwony
opis:wielkość:22cm
BIEŻNIK STOŁOWY
opis:cena:75,00
opis:wielkość:50cmx55cm
CYTRYNY
opis:cena:3,00
opis:kolor:żółty

A więc mamy nazwę towaru, a pod nim zawsze rozpoczynający się od słów "opis" 
charakterystykę tego towaru wyrażoną w zmiennej liczbie linii.
Ten plik tekstowy importuję do accessa, otrzymuję podobną tabelę, dodatkowo 
pole ID ułatwiające sortowanie i potrzebuję powyższe zamienić na taką 
postać:

ABAŻUR CZERWONY;opis:cena:25,00;opis:kolor:czerwony;opis:wielkość:22cm
BIEŻNIK STOŁOWY;opis:cena:75,00;opis:wielkość:50cmx55cm
CYTRYNY;opis:cena:3,00;opis:kolor:żółty

Jak się do tego zabrać ??

Jak masz taki ładnie uporządkowany plik tekstowy to moim zdaniem najlepiej 
zaimportować poprzez VBA: Nazwa towaru - to co pisane dużą czcionką; 3 pola 
z opisem - kolejne wiersze (zwracam uwagę na znak końca linii ;) ) i tak 
stworzysz kolejne rekordy. Trochę rzeźbienia kodu VBA, ale jeśli będzie to 
powtarzalna operacja to będziesz miał automat. 


---
Ta wiadomość została sprawdzona na obecność wirusów przez oprogramowanie antywirusowe Avast.
https://www.avast.com/antivirus
Re: Łączenie tekstu
#137124
Author: karol77marchewka
Date: Sun, 20 Mar 2016 14:14
8 lines
1697 bytes
> Jak masz taki ładnie uporządkowany plik tekstowy to moim zdaniem najlepiej 
> zaimportować poprzez VBA: Nazwa towaru - to co pisane dużą czcionką; 3 pola 
> z opisem - kolejne wiersze (zwracam uwagę na znak końca linii ;) ) i tak 
> stworzysz kolejne rekordy. Trochę rzeźbienia kodu VBA, ale jeśli będzie to 
> powtarzalna operacja to będziesz miał automat. 

Co znaczy zaimportować poprzez VBA ?
Re: Łączenie tekstu
#137125
Author: Prot
Date: Sun, 20 Mar 2016 19:12
80 lines
3807 bytes
Użytkownik <karol77marchewka@gmail.com> napisał w wiadomości 
news:1c9c4fb5-867c-4006-a728-22ab10244b96@googlegroups.com...

Co znaczy zaimportować poprzez VBA ?

To znaczy stworzyć moduł (skrypt) VBA, który przeprowadzi całą operację 
importowania wszystkich danych z pliku tekstowego do założonej tabeli 
accessa.

Przykładowo do importu poprzez VBA danych do excela stosowany może być taki 
moduł:

Sub Importuj()
  Const wOd = 2              'numer wiersza początkowego
  Const wIle = 26              'liczba wierszy
  Const NumeryKolumn = "1,3,4"  'numery importowanych kolumn

  Dim rg       As Range
  Dim sciezka As String, plik As String, linia As String
  Dim kolumny  As String
  Dim T As Variant, U() As Variant
  Dim w As Long, i As Long, j As Long

  On Error GoTo Importuj_Error
                                        'tablica wpisywanego wiersza
  ReDim U(1 To UBound(Split(NumeryKolumn, ",")) + 1)

  kolumny = "," & NumeryKolumn & ","    'będzie wyszukiwanie liczb
                                        'między przecinkami np. ,3,
  sciezka = ThisWorkbook.path & "/"
                                        'miejsce wkopiowania
  Set rg = Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)

  plik = Dir(sciezka & "*.txt")      'czy jest plik tekstowy
  Do While plik <> ""                  'jeśli jest plik
    Open sciezka & plik For Input As #1 'otwórz plik tekstowy

    w = 1
    Do While w < wOd
      If EOF(1) Then Exit Do            'przerwij, bo nie ma co czytać

      Line Input #1, linia            'przeskocz początkowe linie
      w = w + 1
    Loop

    Do Until EOF(1)                  'powtarzaj aż napotkasz koniec pliku

      Line Input #1, linia            'czytaj linię
      T = Split(linia, ";")          'rozbij na elementy wg separatora

      j = 0
      For i = 0 To UBound(T) - 1        'wybierz tylko właściwe kolumny
        If InStr(kolumny, "," & i + 1 & ",") > 0 Then
          j = j + 1
          U(j) = T(i)
        End If
      Next

      rg.Resize(1, UBound(U)) = U      'zapisz do komórek

      Set rg = rg.Offset(1, 0)        'kolejny wiersz docelowy

      w = w + 1
      If w = wOd + wIle Then Exit Do    'przerwij, jeśli to wszystkie linie

    Loop

    Close #1                            'zamknij plik tekstowy
    plik = Dir()                        'szukaj kolejnego pliku
  Loop

Importuj_Exit:
   On Error GoTo 0
   Exit Sub


No niestety żeby spełnić Twoje indywidualne wymagania musisz zgłębić nieco 
podstawy tworzenia modułów VBA lub zlecić stworzenie takiego modułu jakiemuś 
programiście. 
Re: Łączenie tekstu
#137126
Author: Zbigniew Bratko
Date: Tue, 22 Mar 2016 21:44
90 lines
3697 bytes
W dniu 2016-03-19 o 13:00, karol77marchewka@gmail.com pisze:
> Mam plik tekstowy zawierający kilkadziesiąt tysięcy wierszy, np:
>
> ABAŻUR CZERWONY
> opis:cena:25,00
> opis:kolor:czerwony
> opis:wielkość:22cm
> BIEŻNIK STOŁOWY
> opis:cena:75,00
> opis:wielkość:50cmx55cm
> CYTRYNY
> opis:cena:3,00
> opis:kolor:żółty
>
> A więc mamy nazwę towaru, a pod nim zawsze rozpoczynający się od słów "opis" charakterystykę tego towaru wyrażoną w zmiennej liczbie linii.
> Ten plik tekstowy importuję do accessa, otrzymuję podobną tabelę, dodatkowo pole ID ułatwiające sortowanie i potrzebuję powyższe zamienić na taką postać:
>
> ABAŻUR CZERWONY;opis:cena:25,00;opis:kolor:czerwony;opis:wielkość:22cm
> BIEŻNIK STOŁOWY;opis:cena:75,00;opis:wielkość:50cmx55cm
> CYTRYNY;opis:cena:3,00;opis:kolor:żółty

[...]

Spróbuj czegoś takiego:

' założenia:
' jako pierwszy element występuje nazwa towaru
' charakterystyka towaru zaczyna się od ciągu znaków "opis:"
' istnieje tabela tblTowar zawierająca pola tTowar (typu Text lub ew. Nota)
Public Function ReadFile(sFilePath As String)
Dim ff As Integer
Dim sLineText As String
Dim sRecord As String

Dim dbs As DAO.Database
Dim rst As DAO.Recordset

Const cDelim As String * 1 = ";"
Const cSep As String = "opis:"
Const cLenSep As Long = "5"
Const cTableName As String = "tblTowar"
Const cFieldName As String = "tTowar"

   sFilePath = "C:\tmp\test.txt"

   Set dbs = CurrentDb
   Set rst = dbs.OpenRecordset(cTableName, dbOpenDynaset, dbAppendOnly)

     ff = FreeFile
     Open sFilePath For Input As #ff

       Do Until EOF(ff)
         ' wczytaj do buforu linię
         Line Input #ff, sLineText
         ' sprawdź, czy linia nie zaczyna się od tekst "opis:"
         ' lub jest to ostatni rekord
         If (StrComp(Left$(sLineText, cLenSep), cSep, _
             vbBinaryCompare) <> 0) Or EOF(ff) = True Then
           ' zapisz rekord
           If Len(sRecord) > 0 Or EOF(ff) Then
             With rst
               .AddNew
                 ' usuń ostatni separator
                 sRecord = Left$(sRecord, Len(sRecord) - 1)
                 .Fields(cFieldName) = sRecord
               .Update
             End With
             sRecord = sLineText
           End If
           ' pobierz nawę towaru (nadpisz poprzedni pełny rekord)
           sRecord = sLineText & cDelim
         Else
           ' dopisuj kolejne "opisy towaru"
           sRecord = sRecord & sLineText & cDelim
         End If

       Loop
     Close #ff
   rst.Close
   Set rst = Nothing
   Set dbs = Nothing

End Function


-- 
Pozdrowienia
BraZby
www.faq.accdb.pl
www.accdb.pl
Re: Łączenie tekstu
#137127
Author: Zbigniew Bratko
Date: Tue, 22 Mar 2016 21:46
87 lines
3659 bytes
W dniu 2016-03-19 o 13:00, karol77marchewka@gmail.com pisze:
> Mam plik tekstowy zawierający kilkadziesiąt tysięcy wierszy, np:
>
> ABAŻUR CZERWONY
> opis:cena:25,00
> opis:kolor:czerwony
> opis:wielkość:22cm
> BIEŻNIK STOŁOWY
> opis:cena:75,00
> opis:wielkość:50cmx55cm
> CYTRYNY
> opis:cena:3,00
> opis:kolor:żółty
>
> A więc mamy nazwę towaru, a pod nim zawsze rozpoczynający się od słów "opis" charakterystykę tego towaru wyrażoną w zmiennej liczbie linii.
> Ten plik tekstowy importuję do accessa, otrzymuję podobną tabelę, dodatkowo pole ID ułatwiające sortowanie i potrzebuję powyższe zamienić na taką postać:
>
> ABAŻUR CZERWONY;opis:cena:25,00;opis:kolor:czerwony;opis:wielkość:22cm
> BIEŻNIK STOŁOWY;opis:cena:75,00;opis:wielkość:50cmx55cm
> CYTRYNY;opis:cena:3,00;opis:kolor:żółty

[...]

Spróbuj czegoś takiego:

' założenia:
' jako pierwszy element występuje nazwa towaru
' charakterystyka towaru zaczyna się od ciągu znaków "opis:"
' istnieje tabela tblTowar zawierająca pola tTowar (typu Text lub ew. Nota)
Public Function ReadFile(sFilePath As String)
Dim ff As Integer
Dim sLineText As String
Dim sRecord As String

Dim dbs As DAO.Database
Dim rst As DAO.Recordset

Const cDelim As String * 1 = ";"
Const cSep As String = "opis:"
Const cLenSep As Long = "5"
Const cTableName As String = "tblTowar"
Const cFieldName As String = "tTowar"

   Set dbs = CurrentDb
   Set rst = dbs.OpenRecordset(cTableName, dbOpenDynaset, dbAppendOnly)

     ff = FreeFile
     Open sFilePath For Input As #ff

       Do Until EOF(ff)
         ' wczytaj do buforu linię
         Line Input #ff, sLineText
         ' sprawdź, czy linia nie zaczyna się od tekst "opis:"
         ' lub jest to ostatni rekord
         If (StrComp(Left$(sLineText, cLenSep), cSep, _
             vbBinaryCompare) <> 0) Or EOF(ff) = True Then
           ' zapisz rekord
           If Len(sRecord) > 0 Or EOF(ff) Then
             With rst
               .AddNew
                 ' usuń ostatni separator
                 sRecord = Left$(sRecord, Len(sRecord) - 1)
                 .Fields(cFieldName) = sRecord
               .Update
             End With
             sRecord = sLineText
           End If
           ' pobierz nawę towaru (nadpisz poprzedni pełny rekord)
           sRecord = sLineText & cDelim
         Else
           ' dopisuj kolejne "opisy towaru"
           sRecord = sRecord & sLineText & cDelim
         End If

       Loop
     Close #ff
   rst.Close
   Set rst = Nothing
   Set dbs = Nothing

End Function

-- 
Pozdrowienia
BraZby
www.faq.accdb.pl
www.accdb.pl
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads