Thread View: pl.comp.bazy-danych.msaccess
6 messages
6 total messages
Started by karol77marchewka
Sat, 19 Mar 2016 12:00
Łączenie tekstu
Author: karol77marchewka
Date: Sat, 19 Mar 2016 12:00
Date: Sat, 19 Mar 2016 12:00
21 lines
1935 bytes
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
Author: Prot
Date: Sat, 19 Mar 2016 20:15
Date: Sat, 19 Mar 2016 20:15
38 lines
2469 bytes
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
Author: karol77marchewka
Date: Sun, 20 Mar 2016 14:14
Date: Sun, 20 Mar 2016 14:14
8 lines
1697 bytes
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
Author: Prot
Date: Sun, 20 Mar 2016 19:12
Date: Sun, 20 Mar 2016 19:12
80 lines
3807 bytes
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
Author: Zbigniew Bratko
Date: Tue, 22 Mar 2016 21:44
Date: Tue, 22 Mar 2016 21:44
90 lines
3697 bytes
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
Author: Zbigniew Bratko
Date: Tue, 22 Mar 2016 21:46
Date: Tue, 22 Mar 2016 21:46
87 lines
3659 bytes
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