String Identifizieren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

Beitrag von Tsuki-Namida »

sorry doppelpost.....

es ist leider noch ein kleies problem bei diesem code auf getaucht...

Code: Alles auswählen

string$="666,'Test, 2, 3, 4',huhu,'irgend ein, text, mit, Kommas'"
; string$="'Test, 4','Test, 2','Test, 3'"
; string$="Test,513,'Test, 3'"

For i=1 To CountString(string$, ",")+1
a$=StringField(string$, i, ",")
  If Left(a$,1)="'"
    Repeat
    i+1
      a$+","+StringField(string$, i, ",")
    Until Right(a$,1)="'"
  EndIf 
Debug a$
Next 
und zwar wenn sich im string nur ein wort aufhält bleibt der code in der repeat schleife hängen.... also ich meinte das so:
string$ = "'Wort'"
string$ = "wort1,'wort2',wort3"

wen sich halt kein komma in ' ' befindest.....
Bild
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

...sollte nicht so schwer sein...probier`s mal mit If findstring oder so...
Ein bißchen mußt auch selber probieren - hier geht`s ja nur nur um Grundbefehle :wink:
Ich habe den Code ja auch in paar Minuten, während ich gegessen habe (Dinkelnudeln mit Tomatensauße + Parmesan :allright: ), gemacht...naja und da reden ja auch noch meine 2 Kleinen ständig....
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

Beitrag von Tsuki-Namida »

ja das habe ich ja probiert.... wenn ich die ganze fo[...]next schleiche in eine if abfrage machealso:

Code: Alles auswählen

If FindString(string$,",",1)
  For i=1 To CountString(string$, ",")+1 
    [...]
  Next
  Debug a$
Else
  Debug string$
EndIf
denn ich dann nur einen bereich habe wie "'text'"
ist das ja weiterhin kein problem.

wenn aber der string "'text',text" beinhät bleibt das in der schleife und a$ wird bei jeden durchlauf um ein komma verlängertso in etwar:
"'text',text,"
"'text',text,,"
"'text',text,,,"
"'text',text,,,,"
"'text',text,,,,,"
"'text',text,,,,,,"
"'text',text,,,,,,,"
"'text',text,,,,,,,,"
"'text',text,,,,,,,,,"
"'text',text,,,,,,,,,,"
"'text',text,,,,,[...]"

"'text',"
"'text',,"
"'text',,,"
"'text',,,,"
"'text',,,,,"
"'text',,,,,[...]"
und so weiter bis halt der speicher schlap macht

und ich habe überhaupt keine idee wie ich das unterbinden könnte...
und ich kann ja den benutzer der späteren anwendung nich vorschreiben das er immer ein komma setzen muss wenn er was in ' schreibt....

ich bitte euch bitte helft mir und sagt mir wie ich das versuchen kann das ich das so realilsieren kann das es endlich funktioniert.......
Bild
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Also bei mir bleibt da nix hängen...
Kannst du mal den Code exact so posten wie er hängen bleibt?
(\/) (°,,,°) (\/)
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

Beitrag von Tsuki-Namida »

okay ein problem.... 2 warianten wo er hängen bleibt...

Code: Alles auswählen

;string$="666,'Test, 2, 3, 4',huhu,'irgend ein, text, mit, Kommas',neu"
;string$="'Test, 4','Test, 2','Test, 3'"
string$="2345,'Parameter',neu"

If FindString(string$,",",1)
  For i=1 To CountString(string$, ",")+1
  a$=StringField(string$, i, ",")
    If Left(a$,1)="'"
      Repeat
      i+1
        ;Debug a$
        a$+StringField(string$, i, ",")
        ;Debug a$
      Until Right(a$,1)="'"
    EndIf 
  Debug a$
  Next  
Else
  Debug string$
EndIf
wenn der string hier so aus sieht geht es string$ = "'Parameter'" aber sobald ein parameter2 dazukommt geht es nicht mehr da es dann auserhalb von ' ein komma hat....

und hier ein klein wenig anderst also wo wie er gepostet wurde...

Code: Alles auswählen

;string$="666,'Test, 2, 3, 4',huhu$,'irgend ein, text, mit, Kommas',neu"
;string$="'Test, 4','Test, 2','Test, 3'"
string$="2345,'Parameter',neu"

  For i=1 To CountString(string$, ",")+1
  a$=StringField(string$, i, ",")
    If Left(a$,1)="'"
      Repeat
      i+1
        ;Debug a$
        a$+StringField(string$, i, ",")
        ;Debug a$
      Until Right(a$,1)="'"
    EndIf
  Next  
Debug a$
wenn du in diesem string string$="2345,'Parameter',neu" bei 'Parameter' irgent ein komma rein machst geht es wieder also zum beispiel
string$="2345,'Param,eter',neu"
Bild
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Beitrag von helpy »

Ein anderer Versuch:

Code: Alles auswählen

EnableExplicit

Procedure SeperateStrings( string.s, Array result.s(1) )
  Protected *char.Character, *ItemStart.Character
  Protected ItemCount, ItemLength
  Protected bInQuote
  Protected PreDimArray
  
  If string = ""
    ReDim result.s(0)
    result(0) = ""
    ProcedureReturn #Null
  EndIf
  
  PreDimArray = 100
  ReDim result.s(PreDimArray)
  ItemCount = 0
  bInQuote = #False
  
  
  *char = @string
  *ItemStart = *char

  Repeat
    
    Select *char\c

      Case Asc("'")
        bInQuote ! #True

      Case ',', #NUL

        If Not bInQuote Or *char\c = #NUL
          ItemLength = (*char - *ItemStart) / SizeOf(Character)
          result( ItemCount ) = PeekS(*ItemStart, ItemLength )
          *ItemStart = *char + SizeOf(Character)
          ItemCount + 1

          If *char\c = #NUL 
            Break
          EndIf

          If ItemCount > PreDimArray
            PreDimArray + 100
            ReDim result.s( PreDimArray )
          EndIf
        EndIf

      Default
        
    EndSelect

    *char + SizeOf(Character)
  ForEver
  
  ReDim result.s( ItemCount-1 )
  ProcedureReturn ItemCount
EndProcedure

Define i, ItemCount
Define TestString.s
Dim ItemArray.s(0)

Macro TEST( _string_ )
  Debug "TestString: " + _string_
  ItemCount = SeperateStrings( _string_, ItemArray() )
  Debug "Items found: " + Str(ItemCount)
  If ItemCount
    For i = 0 To ItemCount - 1
      Debug "Item " + Str(i) + ": " + ItemArray(i)
    Next i
  EndIf
  Debug ""
EndMacro

TEST( "'text',text" )
TEST( "2345,'Parameter',neu" )
TEST( "'Test, 4','Test, 2','Test, 3'"  )
TEST( "1234,'Test, 2, 3, 4',huhu,'irgend ein, text, mit, Kommas',neu" )

; Und hier ein Test mit falsch formatierten Strings!
TEST( "Text mit [single quote] 'innerhalb' des textes,test1,test2,'text, mit, kommans, und text nach dem [single quote]' falsches format,test3" )
TEST( "test1,test2,test3,'test ohne abschließendes [single quote] ...,test4,test5" )
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Beitrag von alter Mann »

@Tsuki-Namida : dein Fehler liegt in Zeile 7

Code: Alles auswählen

;string$="666,'Test, 2, 3, 4',huhu$,'irgend ein, text, mit, Kommas',neu"
;string$="'Test, 4','Test, 2','Test, 3'"
string$="2345,'Parameter',neu"

  For i=1 To CountString(string$, ",")+1
  a$=StringField(string$, i, ",")
    If Left(a$,1)="'" And Right(a$,1)<> "'"
      Repeat
      i+1
        ;Debug a$
        a$+StringField(string$, i, ",")
        ;Debug a$
      Until Right(a$,1)="'"
    EndIf
  Next 
Debug a$
Win11 64Bit / PB 6.0
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

Beitrag von Tsuki-Namida »

supi danke es funktioniert super :)

ich kapiere nur irgentwie nicht den inhalt der procedure...
Bild
Antworten