Avatar billede martin_moth Mester
10. august 2005 - 12:15 Der er 25 kommentarer og
1 løsning

txt-fil: erstat TAB med spaces

Har en txt-fil med nogle tal kolonner, der er sepereret med tab's.

Hvordan får jeg skiftet dem til spaces, så dataene bliver stående hvor de er?

Hver tab svarer jo ikke til lige mange spaces. Har prøvet alverdens ting med textpad, excel osv. uden held.

Kan man ikke i VB lave noget smart? - er der en måde hvorpå man kan læse hvor mange spaces en tab svarer til, og derefter udskifte tab med spaces?

eksempel på txt-filen ses her:

http://fest.moth-lund.dk/upload/format.htm

selve textfilen kan jeg downloade, hvis nogle der har tid, evner og lyst gider se på det
Avatar billede sjh Nybegynder
10. august 2005 - 12:36 #1
en tab plejer at svare til 4 men i nogle editor kan man selv bestemme det.. så man kan ikke sige 100% at en tab er 4..

strText = Replace(strText, vbTab, "    ")
Avatar billede martin_moth Mester
10. august 2005 - 12:48 #2
Længden af de forskellige tab's er netop ikk ekonstant. Derfor duer det ikke bare at skifte dem ud med et antal spaces.

Og da der er flere hundrede linier, og flere filer, leder jeg efter en eller anden effektiv metode.
Avatar billede sjh Nybegynder
10. august 2005 - 12:51 #3
problemet er måske også din font-type se her:

Private Sub Form_Load()
  Me.AutoRedraw = True

  ' Her står Martin IKKE under Martin
  With Me.Font
      .Name = "MS Sans Serif"
      .Size = 10
  End With
  Print "Hej  Martin"
  Print "Davs Martin"

  ' Her står Martin under Martin
  With Me.Font
      .Name = "Courier New"
      .Size = 10
  End With
  Print "Hej  Martin"
  Print "Davs Martin"
End Sub
Avatar billede sjh Nybegynder
10. august 2005 - 12:55 #4
Jeg er også ret sikker på det er derfor de har lavet de tekst-filer med tab.. ellers ser det jo ud af noget lort.. hvis de åbnes med en anden font-type
Avatar billede sjh Nybegynder
10. august 2005 - 13:10 #5
Du vil aldrig kunne lave det hvis det skal kunne ses.. med alle font-typer


Private Sub Form_Load()
  Me.AutoRedraw = True

  With Me.Font
      .Name = "MS Sans Serif"
      .Size = 10
  End With


  Print "Her her vil det aldrig komme til at passe, fordi det er med mellemrum."
  Print Me.TextWidth("Hej    Martin")
  Print Me.TextWidth("Davs Martin")


  Print "Her her vil det passe, fordi det er med tab."
  Print Me.TextWidth("Hej" & vbTab & "Martin")
  Print Me.TextWidth("Davs" & vbTab & "Martin")
End Sub
Avatar billede martin_moth Mester
10. august 2005 - 13:38 #6
Er helt med på at forskellige fonte ikke har samme bredde.

Min opgave går på at konvertere dataene til en ascii-fil, hvor de står under hinanden. Uden tab's.

Dataene kommer egenligt fra en html-fil hvor de er ordnet i tabeller, ganske nydeligt. Dem har jeg hentet over i excel, og gemt som txt. Det var den eneste måde jeg kunne få det til at se nogenlunde ordenligt ud på. Men der bliver indsat tabs...

Kan ikke finde på andre veje at gå
Avatar billede martin_moth Mester
10. august 2005 - 13:42 #7
Når jeg kopierer fra html over i excel, placerer det sig fint i seperate celler.

Hvis jeg gemmer som DOS-txt, er jeg der næsten - men den fucker stadig op i det.

Hmm - problemet er at komme fra html-filen til txt-filen uden tab's... Om Excel skal ind over ved jeg ikke....
Avatar billede sjh Nybegynder
10. august 2005 - 13:43 #8
Nej.. der der nok ikke nogle anden udvej.. du kan jo også selv se at Excel ikke kan gøre det uden brug af TAB¨s..

Men hvad skal det vises i?? er det Notesblok eller hvad?
Avatar billede martin_moth Mester
10. august 2005 - 13:46 #9
Ja, nok noget i den stil. Det skal læses ind i en totalstation, der kun fatter mellemrum, og som SKAL have dataene ordnet på en bestemt måde, i kolonner.
Avatar billede martin_moth Mester
10. august 2005 - 13:48 #10
Nå - jeg må nok bare læse linie for linei. Bestemme hvordan dataene skal stå for hver linie, afhængig af typen af data, og derefter skrive det til en textfil. Og så en løkke om det hele. Tænkte at der var en genvej
Avatar billede sjh Nybegynder
10. august 2005 - 13:51 #11
Jamen hvad font-type bruger det program som skal læse filerne..
Avatar billede martin_moth Mester
10. august 2005 - 13:53 #12
Det skal jeg nok klare - hvis jeg bare kan finde ud af følgende:

Var1 = "123"
Var2 = "123456"

Nu skal begge variable fylde fx. 8 spaces. Altså hhv.

"    123"
"  123456"

Hvordan gør man det - er det ikk enoget med at der er en funktion "Space()" - eller kan man bruge "Format()" med en masse havelåger?
Avatar billede martin_moth Mester
10. august 2005 - 13:55 #13
Nu er det en ascii-fil. Monospaced - hvad det nu hedder, når hver karakter fylder det samme.
Avatar billede sjh Nybegynder
10. august 2005 - 14:04 #14
Jamen hvis hver karakter fylder det samme.. så er det jo bare at prøve dig frem med..

strText = Replace(strText, vbTab, " ")
strText = Replace(strText, vbTab, "  ")
strText = Replace(strText, vbTab, "  ")
strText = Replace(strText, vbTab, "    ")

så må det vel passe på et tidspunkt..??
Avatar billede martin_moth Mester
10. august 2005 - 14:28 #15
Nej, for de forskellige tab's svare til forskellige antal spaces.... Det er jo netop ideen med tab's
hej<tab><tab>med<tab>dig
hejsa<tab><tab>Anders<tab>And

Det står under hinanden når der anvendes tab's. erstatter jeg hver tab med et bestemt antal spaces, står det ikke længere under hinanden...

Tror at du skal glemme det her, og evt. lige skimme til 10/08-2005 13:53:09
Avatar billede martin_moth Mester
10. august 2005 - 14:30 #16
Hvis det bare var så simpelt at hver tab var lige lang - men det er det jo ikke - jf. nr. 2 indlæg (10/08-2005 12:48:47)
Avatar billede martin_moth Mester
10. august 2005 - 14:34 #17
Summa sumarum: Jeg går en anden vej. Spørgsmål ændret til

Var1 = "123"
Var2 = "123456"

Nu skal begge variable fylde fx. 8 karkakterer. Altså hhv.

"    123"
"  123456"

Hvordan gør man det - er det ikke noget med at der er en funktion "Space()" - eller kan man bruge "Format()" med en masse havelåger?
Avatar billede martin_moth Mester
10. august 2005 - 14:57 #18
Det fører vist ikke til noget. Lukker - shj, smid svar hvis du vil have points.
Avatar billede sjh Nybegynder
10. august 2005 - 15:13 #19
prøv lige den har:

Option Explicit

Private Sub Form_Load()
Dim i As Long, j As Long
Dim strText As String
Dim arrLine() As String
Dim arrTabs() As String
Dim strLine As String
Dim arrTextLength() As Long
Dim blnIsRedim As Boolean

  strText = strText & "Hej" & vbTab & "med" & vbTab & "dig" & vbCrLf
  strText = strText & "dette" & vbTab & "ser" & vbTab & "da" & vbCrLf
  strText = strText & "ud" & vbTab & "til at" & vbTab & "virke" & vbCrLf

  arrLine = Split(strText, vbCrLf)
  For i = LBound(arrLine) To UBound(arrLine)
    arrTabs = Split(arrLine(i), vbTab)
    For j = LBound(arrTabs) To UBound(arrTabs)
      If blnIsRedim = False Then
        ReDim arrTextLength(LBound(arrTabs) To UBound(arrTabs)) As Long
        blnIsRedim = True
      End If
      If Len(arrTabs(j)) >= arrTextLength(j) Then
        arrTextLength(j) = Len(arrTabs(j)) + 2 ' <- din tab bliver så 2 mellemrum her
      End If
    Next 'j
  Next 'i

  arrLine = Split(strText, vbCrLf)
  For i = LBound(arrLine) To UBound(arrLine)
    arrTabs = Split(arrLine(i), vbTab)
    For j = LBound(arrTabs) To UBound(arrTabs)
      strLine = (strLine & RightSpace(arrTabs(j), arrTextLength(j)))
    Next 'j
    strLine = (strLine & vbCrLf)
  Next 'i

  'HUSK -> Text1.MultiLine = True
  Text1.Font.Name = "Courier New"
  Text1.Text = strLine
End Sub

Public Function RightSpace(strText As String, intSpace As Long) As String
  RightSpace = strText & Space$(intSpace - Len(strText))
End Function
Avatar billede sjh Nybegynder
10. august 2005 - 15:16 #20
skal nok være sådan..

Option Explicit

Private Sub Form_Load()
Dim i As Long, j As Long
Dim strText As String
Dim arrLine() As String
Dim arrTabs() As String
Dim strLine As String
Dim arrTextLength() As Long
Dim blnIsRedim As Boolean

  strText = strText & "Hej" & vbTab & vbTab & "med" & vbTab & "dig" & vbCrLf
  strText = strText & "dette" & vbTab & "ser" & vbTab & "da" & vbCrLf
  strText = strText & "ud" & vbTab & "til at" & vbTab & "virke" & vbCrLf

  Do While InStr(1, strText, vbTab & vbTab)
    strText = Replace(strText, vbTab & vbTab, vbTab)
  Loop

  arrLine = Split(strText, vbCrLf)
  For i = LBound(arrLine) To UBound(arrLine)
    arrTabs = Split(arrLine(i), vbTab)
    For j = LBound(arrTabs) To UBound(arrTabs)
      If blnIsRedim = False Then
        ReDim arrTextLength(LBound(arrTabs) To UBound(arrTabs)) As Long
        blnIsRedim = True
      End If
      If Len(arrTabs(j)) >= arrTextLength(j) Then
        arrTextLength(j) = Len(arrTabs(j)) + 2 ' <- din tab bliver så 2 mellemrum her
      End If
    Next 'j
  Next 'i

  arrLine = Split(strText, vbCrLf)
  For i = LBound(arrLine) To UBound(arrLine)
    arrTabs = Split(arrLine(i), vbTab)
    For j = LBound(arrTabs) To UBound(arrTabs)
      strLine = (strLine & RightSpace(arrTabs(j), arrTextLength(j)))
    Next 'j
    strLine = (strLine & vbCrLf)
  Next 'i

  'HUSK -> Text1.MultiLine = True
  Text1.Font.Name = "Courier New"
  Text1.Text = strLine
End Sub

Public Function RightSpace(strText As String, intSpace As Long) As String
  RightSpace = strText & Space$(intSpace - Len(strText))
End Function
Avatar billede martin_moth Mester
10. august 2005 - 15:23 #21
Du er s..... hurtig!!!

Ja, det ser ud til at virke...
Avatar billede martin_moth Mester
10. august 2005 - 15:24 #22
Smart først at sørge for at der kun er EN tab mellem hver
Avatar billede martin_moth Mester
10. august 2005 - 15:27 #23
det var faktisk det der var løsningen :o)
Avatar billede martin_moth Mester
10. august 2005 - 15:27 #24
takker

Har dog lavet en anderledes løsning, men inspireret af din
Avatar billede sjh Nybegynder
10. august 2005 - 17:31 #25
det var da godt du fik det til at virke.. trode bare først at det skulle bruges til alle font-typer :D

tak for point
Avatar billede martin_moth Mester
10. august 2005 - 20:44 #26
Som det fremgår af en anden tråd, har jeg lavet det - og mistet det. Og er nu ved at lave det - igen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester