Mam taki problem. Wczytuje plik tekstowy. Dzielę go sobie na wiersze i kolumny. I musze posortowac go przykładowo po 3 kolumnie, w taki sposób aby cały wiersz szedł za ta wartością z 3 kolumny podczas sortowanie. I za cholere nie wiem jak to zrobic. Czy wrzucic to lepiej do macierzy. Jak wrzucam wszystko do macierzy to też mi nie idzie. poprostu nie wiem jak to zrobic
Prosze o pomoc
a = [%w[a c b s e], %w[s e y a h], %w[b n f r u]]
a.sort{|x,y| x[2]<=>y[2]}
=> [["a", "c", "b", "s", "e"], ["a", "n", "f", "r", "u"], ["s", "e", "y", "a", "h"]]
awk | sort ;]
a w ruby:
mycsv.sort_by { |row| row.values_at(2, 0, 1) }.each do |row|
…
end
[ [9,‘ash’,‘cube’],
[8,‘blue’,‘cube’],
[3,‘mauve’,‘frustrum’],
[8,‘green’,‘cube’]
].sort_by{|a| a.values_at( 2,0,1 ) }.
each{|a| p a }
— output -----
[8, “blue”, “cube”]
[8, “green”, “cube”]
[9, “ash”, “cube”]
[3, “mauve”, “frustrum”]
Pierwsza rzecz z google, nie sprawdzalem ale na oko wyglada sensownie
Przepraszam ale dopiero uczę się programowac i idzie mi to bardzo opornie.
plik=File.new(“E:/gibon.txt”,“r”)
plik1=File.new(“E:/gibon1.txt”,“w”)
while wiersz=plik.gets
columns=wiersz.split
columns.sort_by{|wiersz|columns.values_at(4)}.each do |wiersz|
end
plik1.puts(wiersz)
end
plik.close
plik1.close
Mój pilik zawiera 7 kolumn i chciałbym go po sortowac po czwartej kolumnie tak żeby wartości z pozostałych kolumn szły za ta wartością z czwartej. Program nie ma błedów ale nie sortuje jak by mi mógł to wytłumaczyc bym był wdzięczny
plik musi miec jakas strukture sensowna jak np CSV, ktory zazwyczaj jest rozdzielony “,” przecinkiem. Mozna uzyc gotowej biblioteki do CSV, lub zrobic to recznie.
Czyli musisz przeczytac plik i do zrzutowac (przeksztalcic) sobie te linie na np tablice. Uzywasz nawet odpowiednuch metod wiec juz jestes blisko. Musisz linie zamienic na tablice.
Czyli jak np ruby ci przeczyta linie w postacie “Ala, Ola, Ania, Zosia”
To jest to napis (string, musisz to rozbic na skladowe, czyli dac na tym split
a = “Ala, Ola, Ania, Zosia”
b = a.split(’,’) # to da ci w zmiennej b tablice [“Ala”, “Ola”, “Ania”, “Zosia”]
Jak juz masz linie jako tablice, to zbierasz wszytskie linie w tablicy innej.
duza_tablica = []
czytasz.plik linia po lini {
duza_tablica << “napis”.split(’,’)
}
wtedy w duza_tablica masz mniej wiecej to co kilka postow wyzej
A no i zeby posortowac po czwartej to dajesz tak jak wyzej, tylko zamistas (2,0,1) dajes (3) - 3 bo kolumny licza sie od 0 wiec 4 to bedzie 3 i tyle
Zakładając, że masz plik tekstowy w którym separatorem jest spacja oraz że objętościowo zmieści się cały w pamięci:
[code=ruby]# wczytujesz text z pliku do tablic
arrays = []
File.open(“input.txt”, “r”) do |f|
while line = f.gets
arrays << line.split
end
end
sortujesz po 4. (n-tej) kolumnie i składasz w stringa
n = 4
lines = “”
arrays.sort{|x,y| x[n-1] <=> y[n-1]}.each do |arr|
lines << arr.join(" ") << “\n”
end
zapisujesz wynik do pliku
File.open(“out.txt”, “w”) do |f|
f.write(lines)
end[/code]
super dziękuje bardzo wszystko działa.
arrays.sort{|x,y| x[n-1] <=> y[n-1]}.each do |arr|
lines << arr.join(" ") << “\n”
Tylko chciałbym jeszcze to lepiej zrozumiec co tu sie wydarzyło
Chciałbym sie dowiedziec co to jest zmnienna x, y i ogólnie tak pokolei jak program to robi tylko te dwie linnijki bo tak to wszystko rozumiem
[quote=RawOnRails]Zakładając, że masz plik tekstowy w którym separatorem jest spacja oraz że objętościowo zmieści się cały w pamięci:
[code=ruby]# wczytujesz text z pliku do tablic
arrays = [] # definicja pustej tablicy
File.open(“input.txt”, “r”) do |f| # czytasz plik
while line = f.gets #linia po lini
arrays << line.split #dodajesz linie rozbita a elementy jako tablica do tablicy
end
end
sortujesz po 4. (n-tej) kolumnie i składasz w stringa
n = 4 # po ktorej kolumnie
lines = “” # czyscisz zmienna
arrays.sort{|x,y| x[n-1] <=> y[n-1]}.each do |arr| # sortujesz tablice tablic (tu masz cos takiego [[a,b,c], [b,c,a], […]], x,y to poptostu zmienne, potrzebujesz 2 elementy by je do siebie przyrównać, ten element to tablica, z tablicy wybierasz element na pozycji n-1 (liczysz od zera stąd ten -1) i porównujesz oba, je sobie sortujesz i tak w kólko
lines << arr.join(" ") << “\n” # łącyzsz to ponownie
end
zapisujesz wynik do pliku
File.open(“out.txt”, “w”) do |f|
f.write(lines)
end[/code]
[/quote]
Dzięki już wszystko jasne