Hej Alla! Hej Hej igen Igen Hej! Imponerad... Lär mig o allsmäktiga tomsve... Hej! Oooj........ du har varit i banschen i ett antal trettio år va...?Plocka Ut Andra Kolumnen Ur Textfilen
Det var ett tag sedan jag senast använde Visual Basic så jag skulle vara tacksam om jag kunde få lite hjälp...
Problemet är nog enkelt men svårt att lösa på ett bra sätt!
Jag har en textfil med 975 684 tecken vilket motsvarar 14 622 rader.
Varje rad innahåller 11 columner.
Ett uttrag ur textdokumentet:
"SUPRTNDNT-LONNIE E PALMER","ALBANY CITY SD","010100010000","ACADEMY PARK","ALBANY","NY","122071099","518","4627200","3","0"
Jag vill att mitt program tar ut den andra kolumnen ur dokumentet och sedan sparar det i en ny fil.
Sen kan jag själv lägga upp kolumen i flera ~er i ett worddokument.
Son jag sa - "Problemet är nog enkelt men svårt att lösa på ett bra sätt!"
Vänliga Hälsningar
Per EricssonSv: Plocka Ut Andra Kolumnen Ur Textfilen
Om du har VB 6.0 kan du använda den utmärkta
funktionen Split som lagrar texten i en Array
Så här skulle det kunna se ut.Du använder lämpligen
, (komma) som separator.
Dim SplitArr() As String
SplitArr = Split(dinInputString,",")
Nu kan du plocka varje ord ur Arrayen med början SplitArr(0) - (10)
mvh
SvenSv: Plocka Ut Andra Kolumnen Ur Textfilen
Wooops ! ditt problem var mer komplicerat än jag först trodde.
Pga "SUPRTNDNT-LONNIE E PALMER", "ALBANY CITY SD", "010100010000", "ACADEMY PARK", "ALBANY", "NY", "122071099", "518", "4627200", "3", "0"
Dvs " tecken och , så blir det problem med Split.
Utmaning hur löser Ni detta problem ? .Mitt svar kommer strax
DSSv: Plocka Ut Andra Kolumnen Ur Textfilen
Option Explicit
Private Sub Command1_Click()
'Så här blev min principlösning som fungerar.
'Försökte lösa det med Replace men det blev för struligt.
'Finns säkert smartare lösningar men som sagt det här kan funka.
'Luta dig tillbaka och låt datorn arbeta
'Editer om Orginalfilen för anpassning till Split
Dim FileNum As Long, FileNum2 As Long
Dim i As Long, filemax As Long, tmpStr As String
Dim tmpByte As String * 1, pos As Long
Dim SplitArr() As String
FileNum = FreeFile
'Kopia av din orginalfil
Open "E:\Vb6\SplitTest.txt" For Binary As #FileNum
filemax = LOF(FileNum)
For i = 1 To filemax
Get #FileNum, i, tmpByte
If tmpByte = Chr$(34) Then _
Put #FileNum, i, Chr$(32) ' " apostrof till space
If tmpByte = Chr$(44) Then _
Put #FileNum, i, Chr$(182) ' Chr$(44) , (komma) blir Chr$(182) avskiljare
Next 'i
Close #FileNum
FileNum = FreeFile
'Den nu anpassade orginalfilen
Open "E:\Vb6\SplitTest.txt" For Input As #FileNum
FileNum2 = FreeFile
'Din nya utfil med kolumn 2
Open "C:\NyText.txt" For Append As #FileNum2
Do Until EOF(FileNum)
Line Input #FileNum, tmpStr
SplitArr = Split(tmpStr, Chr$(182))
Print #FileNum2, Trim$(SplitArr(1))
Loop
Close #FileNum
Close #FileNum2
End Sub
DSSv: Plocka Ut Andra Kolumnen Ur Textfilen
Har skrivit en annan lösning.
Den tillåter t ex rader som
"SUPRTNDNT-LONNIE, E PALMER","ALBANY CITY SD" ...
osv (lägg märkte till kommatecknet), och parsar det som
"SUPRTNDNT-LONNIE, E PALMER"
och inte t ex
"SUPRTNDNT-LONNIE,
<code>
strFile = "x:\testfil.txt" ' filen du vill dona med
strNewFile = "x:\nytextfil.txt" ' den nya filen
iCountColumns = 11 ' antal kolumner i filen du vill dona med
iReadColumn = 2 ' vilken kolumn som ska läsas och sparas ned i den nya filen
' Gör kopia av orginalet
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CopyFile strFile, strFile & ".bak"
' Läs in filen i strFileData
Set objOTF = objFSO.OpenTextFile(strFile, 1, True)
strFileData = objOTF.ReadAll
Set objOTF = Nothing
' Parsa innehållet i filen
Set objRE = New RegExp
objRE.Pattern = """([^""\\]*(\\.[^""\\]*)*)"",?|([^,]+),?|,"
objRE.Global = True
Set objMatches = objRE.Execute(strFileData)
c = 0
For Each colValue In objMatches
c = c + 1
If c = iReadColumn Then strColumnData = strColumnData & Left(colValue, Len(colValue) - 1) & vbCrLf
If c = iCountColumns Then c = 0
Next
Set objMatches = Nothing
Set objRE = Nothing
' Spara det i strNewFile
Set objCTF = objFSO.CreateTextFile(strNewFile, True)
objCTF.WriteLine (strColumnData)
objCTF.Close
Set objFSO = Nothing
</code>
Lycka till och lev väl,
Tom S.Sv: Plocka Ut Andra Kolumnen Ur Textfilen
Vad betyder din Pattern mönster?
"""([^""\\]*(\\.[^""\\]*)*)"",?|([^,]+),?|,"
Sv: Plocka Ut Andra Kolumnen Ur Textfilen
Strängen
"""([^""\\]*(\\.[^""\\]*)*)"",?|([^,]+),?|,"
...kan vi skriva som regexet...
"([^"\\]*(\\.[^"\\]*)*)",?|([^,]+),?|,
Vi kan dela upp det i tre delar, separerade med pipe-tecknet (|) som i regex betyder "eller":
"([^"\\]*(\\.[^"\\]*)*)",?
eller
([^,]+),?
eller
,
Förklaringar
= 1 ===================================================
"([^"\\]*(\\.[^"\\]*)*)",?
Betyder att strängen som vi letar efter ska börja med ett citationstecken och sluta med ett citationstecken. Kommatecknet är inte ett krav för att den här biten ska uppfyllas, så därför följls kommatecknet av ett frågetecken.
([^"\\]*(\\.[^"\\]*)*)
Gör det möjlighet att escapea tecken (främst citationstecken) i texten som man vill bearbeta (någon som vill ha förklaring av det regexuttrycket - skrik till så ska jag förklara). Den första kolumnen ur texten
"Tom \"tomsve\" Svensson", "Guldsmedsvägen 7, 3tr", "Stockholm"
skulle då bli/accepteras som
"Tom \"tomsve\" Svensson"
En enklare version av den första av dom tre bitarna skulle kunna vara
"[^"]*",?
Vilket betyder ungefär "Texten måste börja med ett citationstecken, vilket tecken som helst får förekomma efter det, bara det INTE är ett citationstecken. När ett citationstecken dyker upp, så kolla om det efterförljs av ett kommatecken (dock inte obligatoriskt för att den här biten ska returneras som sann). "
Tar hand om strängar som ser ut t ex
"Tom Svensson"
eller
"Tom Svensson",
= 2 ===================================================
Om den första biten inte uppfylls, så kontrollerar regexpobjektet den andra biten
([^,]+),?
Vilket tecken som helst, bara det inte är ett kommatecken. Ska efterförljas av ett kommatecken (dock inte obligatoriskt för att den här biten ska returneras som sann).
Tar hand om strängar som ser ut t ex
0708422804
eller
0708422804,
= 3 ===================================================
Om ingen av dom två bitar som vi gått igenom har uppfyllts, så kommer sista alternativet:
,
Helt enkelt: Det måste finnas ett kommatecken.
Tar hand om strängar som ser ut t ex
,
(alltså tomma poster)
Hoppas det klarnade lite nu. Har börjat med en liten regexkurs till PelleSoft som borde dyka upp om ett tag.
Ta väl hand om er!
Tom S.Sv: Plocka Ut Andra Kolumnen Ur Textfilen