Eliminare spazi vuoti


#1

Ciao ragazzi,eccomi di nuovo a chiedere il vostro aiuto.Ho creato un
pre-programma che ha lo scopo di eliminare gli spazi vuoti che si
trovano all’inizio delle frasi,ad esempio:

" ciao" #sono tante frasi che hanno gli spazi
simili a
" come va" #questo che ho scritto
“tutto bene”

Io ho provato con questo codice,che va a leggere il testo da un file
txt.Il codice è il seguente:

primariga=[]
arr=IO.readlines(“prova.txt”)
valore=0
for i in 0 … arr.size-1 #Ho creto questo for in modo che si vada a
prendere
primariga=arr[valore].split(/\s/) #una frase alla volta,e gli applchi
valore=valore+1 #il blocco di codice
while primariga[0] == nil
…codice del blocco…
puts “eccoci” #l’ho usato per vedere se funziona bene il
while
end
end

Il problema che ho è che ottengo un loop infinito di parole
“eccoci”.Come posso risolvere???


#2

Se vuoi eliminare gli spazi all’inizio di una stringa puoi usare lstrip

" ciao".lstrip

restituisce “ciao”.

Il giorno 23 aprile 2009 15.51, Stefano De nigris
removed_email_address@domain.invalidha scritto:


#3

Il giorno 23 aprile 2009 15.51, Stefano De nigris
removed_email_address@domain.invalidha scritto:

valore=valore+1 #il blocco di codice
while primariga[0] == nil
…codice del blocco…
puts “eccoci” #l’ho usato per vedere se funziona bene il
while
end
end

Il problema che ho è che ottengo un loop infinito di parole
“eccoci”.Come posso risolvere???
http://lists.ruby-it.org/mailman/listinfo/ml

Prova a modificarlo
così:
primariga << arr[valore].split(/\s/)


#4

Stefano, non ho capito bene cosa devi fare. Tu hai u file di testo e
vuoi
eliminare gli spazi all’inizio di ogni riga?

Il giorno 23 aprile 2009 16.23, Stefano De nigris
removed_email_address@domain.invalidha scritto:


#5

Perfetto è quella l’idea…pero è da oltre a queste righe che inziano
con spazi vuoti ci sono anche righe con spazi vuoti,e in quel caso
vorrei che non facesse niente il blocco di codice.Un esempio di testo
eccolo:

" ciao ciao"
" come va??tutto bene"
" "
“eh si tutto bene :D”
" meglio cosi"
" allora io vado ciao"

Spero di aver reso l’idea. :wink:


#6

prova se questo va bene

righe_senza_spazi = []

open(“prova.txt”) do |f|
f.each{|l| righe_senza_spazi << l.strip}
end

righe_senza_spazi.each do |r|
puts r
end

Il giorno 23 aprile 2009 16.37, Stefano De nigris
removed_email_address@domain.invalidha scritto:


#7

2009/4/23 Stefano De nigris removed_email_address@domain.invalid

" meglio cosi"
" allora io vado ciao"

Spero di aver reso l’idea. :wink:

One liner:

file = File.readlines(“prova.txt”).map{|line| l =~ /\s+\n/ ? line :
line.lstrip }.join

Poi stampi o scrivi nel file il contenuto della stringa ‘file’.
Ciao,
Antonio

http://antoniocangiano.com - Zen and the Art of Programming
http://math-blog.com - Mathematics is wonderful!
http://stacktrace.it - Aperiodico di resistenza informatica
Follow me on Twitter: http://twitter.com/acangiano
Author of “Ruby on Rails for Microsoft Developers”:
http://bit.ly/rorforms


#8

Pierpaolo…la soluzione sarebbe quella che hai detto tu,pero prima di
fare cio devi far funzionare il blocco del while,perche non vuole
saperne di funzionare;ad esempio se fai nel blocco del while–>
puts"ciao" noterai che non ti stampera nulla a video.Quindi il problema
è li.

Davide dove lo devo sostituire??Tu dici in:
primariga=arr[valore].split(/\s/)

Se è si…non posso modificare questo valore perche se no mi
modificherebbe tutto il programma che viene dopo questo
pre-programma.Capito???


#9

2009/4/23 Antonio C. removed_email_address@domain.invalid

file = File.readlines(“prova.txt”).map{|line| l =~ /\s+\n/ ? line :
line.lstrip }.join

Poi stampi o scrivi nel file il contenuto della stringa ‘file’.

Scusa, ho cambiato il nome dell’argomento del blocco all’ultimo secondo:

file = File.readlines(“prova.txt”).map{|line| line =~ /\s+\n/ ? line :
line.lstrip }.join


http://antoniocangiano.com - Zen and the Art of Programming
http://math-blog.com - Mathematics is wonderful!
http://stacktrace.it - Aperiodico di resistenza informatica
Follow me on Twitter: http://twitter.com/acangiano
Author of “Ruby on Rails for Microsoft Developers”:
http://bit.ly/rorforms


#10

Pierpaolo scusa ma sarò un rompi… ma non è possibile usare questo
codice:

primariga=[]
arr=IO.readlines(“prova.txt”)
valore=0
for i in 0 … arr.size-1
primariga=arr[valore].split(/\s/)
valore=valore+1
while primariga[0] == nil #o un altro costrutto ciclico
…blocco di codice in cui userò lstrip…
puts"ciao" #è per verificare se funzione il while
end
puts primariga.join(" ")
end

andando pero a cambiare solo il while con un if (o un altro costrutto
ciclico)??Perche tutte le istruzioni,escluse il while,fanno parte di un
programma che converte il file di testo.Quindi se vado a cambiare tutto
questo codice significa che cambiero tutto il programma.Scusami!!!

Antonio…ho provato ad applicarla mi mi escono solo numeri,credo che
rappresentino le parole.


#11

Il 23 aprile 2009 15.51, Stefano De nigris removed_email_address@domain.invalid ha
scritto:

end
Il problema che ho è che ottengo un loop infinito di parole “eccoci”

questo vuol dire che, quando arrivi al while, primariga[0] vale nil.
dentro il loop, primariga[0] non viene cambiato, quindi continua a
valere nil.

questo è un ciclo infinito.

potresti usare un qualche indice invece di zero, ma le soluzioni di
Pierpaolo e Antonio sono migliori.

pietro


#12

2009/4/23 Stefano De nigris removed_email_address@domain.invalid

Antonio…ho provato ad applicarla mi mi escono solo numeri,credo che
rappresentino le parole.

Non stai usando Ruby 1.8?

http://antoniocangiano.com - Zen and the Art of Programming
http://math-blog.com - Mathematics is wonderful!
http://stacktrace.it - Aperiodico di resistenza informatica
Follow me on Twitter: http://twitter.com/acangiano
Author of “Ruby on Rails for Microsoft Developers”:
http://bit.ly/rorforms


#13

Si perche?


#14

lo sto usando


#15

Ho provato a cancellare tutto il codice inziale che avevo creato e l’ho
sostituito con il tuo (Antonio) e funziona perfettamente.Tuttavia non
posso applicarlo al mio programma perche se no mi cambia tutto e dovrei
rifarlo dall’inizio.Esiste una soluzione simile da applicare a questo
codice qui:

primariga=[]
arr=IO.readlines(“prova1.txt”)
valore=0

for i in 0 … arr.size-1
primariga=arr[valore].split(/\s/)
valore=valore+1
puts primariga
end


#16

On Thu, Apr 23, 2009 at 11:16 AM, Stefano De nigris
<removed_email_address@domain.invalid

wrote:

Si perche?

OK. Prova ad eseguire la riga seguente:

puts File.readlines(“prova.txt”).map{|line| line =~ /\s+\n/ ? line :
line.lstrip }.join

Poi copiami l’output (o parte dell’output) che ottieni.

Ciao,
Antonio

http://antoniocangiano.com - Zen and the Art of Programming
http://math-blog.com - Mathematics is wonderful!
http://stacktrace.it - Aperiodico di resistenza informatica
Follow me on Twitter: http://twitter.com/acangiano
Author of “Ruby on Rails for Microsoft Developers”:
http://bit.ly/rorforms


#17

Non ho capito bene come deve funzionare il programma. Ho modificato
così il
tuo (prendendo spunto anche da quello di Antonio)

primariga=[]
arr=IO.readlines(“prova.txt”)
valore=0
testo_senza_spazi = “”
for i in 0 … arr.size-1
primariga=arr[valore].split(/\s/)
valore=valore+1

line = arr[valore-1]
testo_senza_spazi << (line =~ /\s+\n/ ? line : line.lstrip)

puts primariga.join(" ")
end

puts
puts testo_senza_spazi

ho modificato solo il ciclo while

Il giorno 23 aprile 2009 17.21, Stefano De nigris
removed_email_address@domain.invalidha scritto:


#18

Ok pierpaolo grazie,facendo qualche modifica funziona.
Grazie Antonio,Pietro e Davide mi avete risolto un grande problema.

Ciao a tutti!!!


#19

Ciao ragazzi ho una curiosità da chiedervi.Come sapete ho modificato il
programma che mi è stato suggerito da Pierpaolo in questo modo:

primariga=[]
arr=IO.readlines(“record.txt”)
valore=0
testo_senza_spazi = [/\s/]
for i in 0 … arr.size-1
primariga=arr[valore].split(/\s/)
valore=valore+1

line = arr[valore-1]
testo_senza_spazi << (line =~ /\s+\n/ ? line : line.lstrip)
primariga=testo_senza_spazi
puts primariga
end

in modo tale che funzioni per il mio caso specifico.Il mio dubbio è il
seguente: è possibile far stampare una sola volta la variabile
primariga,perche se lo mandate in esecuzione con questo testo:

type
nomeclasse=class(piugrande)
public
constructor nome;
destructor destroy;override;
procedure clear;
procedure load(stream:tstream);
function write(buffer:longint):longint;override;
private
procedure setcapacity(newcapacity:longint);
protected
function reajlloc(var newcapacity:longint):pointer;virtual;
property capacity:longint read fcapacity write setcapacity;
end;

noterete che stampa ciclicamente il testo,che è corretto.Ok?!

Ciao ciao


#20

Ok ragazzi ho risolto.Gli ho fatto creare un altro file txt,su cui poi
lavorera il mio programma generale.:smiley: :smiley:

Ciao