Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Zeilen in einer Datei sortieren

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
s-m-n



Anmeldungsdatum: 03.10.2005
Beiträge: 106
Wohnort: Pietling in Oberbayern / Deutschland

BeitragVerfasst am: 12.10.2006, 15:02    Titel: Zeilen in einer Datei sortieren Antworten mit Zitat

Hi,

ich hab hier eine Textdatei, deren Zeilen jeweils mit dreistelligen Zahlen beginnen. Die Zahlenreihe ist nicht vollständig; es fehlen immer wieder einzelne oder mehrere.

Wie kann ich diese Zeilen am besten nach den oben beschriebenen Zahlen sortieren?

Danke!

Gruß s-m-n
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 12.10.2006, 15:52    Titel: Antworten mit Zitat

ich poste jetzt keinen coder, aber dafür das prinzip zwinkern

1. mit while not eof(dateinummer) die zeilen zählen.
2. array anlegen (1 to zeilenanzahl)
3. mit while alle zeilen in das array einlesen
4. sortieren: du musst maximal zeilenanzahl ^ 2 mal durch das array gehn und dabei gucken ob zeile(x) > zeile (x+1) falls das wahr ist, musst du swap zeile(x), zeile(x+1). dabei darfst du naütrlich jedes mal nur bis zeilenanzahl-1 gehn... ach was solls, einfach mal ein code posten^^ aber nur für diesen schritt
Code:

for a  = 1 to zeilenanzahl
  ready = 1
  for b = 1 to zeilenanzahl -1
    if zeile(b) > zeile (b+1) then swap zeile(b), zeile(b)+1: ready = 0
  next
  if ready = 1 then exit for

noch fragen?

achja: das beispiel wird die zahlen wohl kaum in der reihenfolge 1...99.100...999.1000 speichern sondern in der reihenfolge 1...100...1000...99...999. müsste zumindest so sein verlegen
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.


Zuletzt bearbeitet von Jojo am 12.10.2006, 15:54, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 12.10.2006, 15:53    Titel: Antworten mit Zitat

sorry, falschen button gedrückt, bitte diesen sinnlosen löschen^^
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 12.10.2006, 17:28    Titel: Antworten mit Zitat

eine weitere Möglichkeit (nur Entwurf)

Code:
...
Sub RapidSort (Item()As Integer, LoElement As Integer, HiElement As Integer)
 Dim As Integer n, wert, nptr, arr, rep, LoVal, HiVal
 'größte und kleinste Wert bestimmen
   LoVal=Item(LoElement)
   HiVal=Item(HiElement)
   FOR n = LoElement TO HiElement
     If LoVal> Item(n) Then LoVal=Item(n)
     If HiVal< Item(n) Then HiVal=Item(n)
   Next
 'ein SortArray erstellen, als Index größte bis kleinste Wert
 ReDim SortArray(LoVal TO HiVal) As Integer
 'in SortArray wird gezählt wie oft jeder Wert in Item() vorkommt
   FOR n = LoElement TO HiElement
     wert = Item(n)
     SortArray(wert) = SortArray(wert) + 1
   Next
 'umkopieren SortArray => Item sortiert
   nptr = LoElement - 1
   FOR arr = LoVal TO HiVal
     rep = SortArray(arr)
     FOR n = 1 TO rep
       nptr = nptr + 1
       Item(nptr) = arr
     Next
   Next
 Erase SortArray
END Sub

...
i=0
while EOF(#ff)>0
  lineinput Zeile(i)
  Item(VAL(Zeile(i))) = i
  i+=1
wend
i-=1

RapidSort (Item(), 0, i)

for n= 0 to i
Print Zeile(Item(n))
next
...

_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.


Zuletzt bearbeitet von volta am 12.10.2006, 17:41, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 12.10.2006, 17:37    Titel: Antworten mit Zitat

Hi,
ich empfehle selbstverständlich QSort.Bas
(nicht nur weil es von mir ist..), sondern:
-der Typ kann freigewählt werden
-kann auf- und abwärts sortieren
-hat sich bei dem volta-Test ganz tapfer geschlagen grinsen
-dieser QSort eben in voltas Post fehlt happy
Gruß
ytwinky
_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 12.10.2006, 17:46    Titel: Antworten mit Zitat

Hi ytwinky,
da hat sich mein EDIT mit deinem Beitrag überschnitten... grinsen sorry...
Hier der Link auf die Auswahl einiger Sortierprogramme:
http://www.freebasic.de/fbnp/?view=357
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
s-m-n



Anmeldungsdatum: 03.10.2005
Beiträge: 106
Wohnort: Pietling in Oberbayern / Deutschland

BeitragVerfasst am: 12.10.2006, 18:52    Titel: Antworten mit Zitat

Hi,

Erstmal danke für die vielen Lösungsvorschläge! lächeln Aus allen Vorschlägen hat mir aber Jojo's Code am besten gefallen.

@Jojo

Danke, dein Code passt wie die Faust auf's Auge. Aber du hast ein 'next' vergessen und ich hab den Wert b von 1 auf 0 korrigiert (weil mein Zeilenzähler bei 0 anfängt). Mein Proggi sieht jetzt so aus und funktioniert wunderbar:

Code:
dim as integer zeilen, f, a, b, ready
dim as string zeile(255)

f = FREEFILE

OPEN "futter.csv" FOR INPUT AS #f

WHILE NOT EOF(f)
    LINE INPUT #f, zeile(zeilen)
    zeilen+=1
WEND


CLOSE #F

for a  = 1 to zeilen
  ready = 1
  for b = 0 to zeilen -1
    if zeile(b) > zeile (b+1) then swap zeile(b), zeile(b+1): ready = 0

next
if ready = 1 then exit for
next

open "futter2.csv" for append as #2
for i = 0 to zeilen
    print #2, zeile(i)
next
close #2



Gruß s-m-n
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 12.10.2006, 21:57    Titel: Antworten mit Zitat

dann ists ja gut, glückwunsch^^

übrigens: wenn dein zeilenzähler von 0 bis zeilen zählt, ist das eine zeile mehr als eingelesen wurde!
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 13.10.2006, 00:06    Titel: Antworten mit Zitat

@volta:
n.p. happy
Gruß
ytwinky
_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz