Strip is not stripping trailing whitespace

T

Taylor Strait

I have files with city names which have one or two trailing whitespaces:

Adelanto <-
Agoura Hills <-
Alameda <-
Albany <-
Alhambra <-
Aliso Viejo <-

My method just iterates and strips!

def trim(state)
diskfile = File.new(state + "-cleaned.txt", "w")
$stdout = diskfile

IO.foreach(state + ".txt") do |line|
line.strip!
puts line
end

diskfile.close
$stdout = STDOUT
end

The output successfully removes leading whitespace but not trailing
whitespace. What am I doing wrong? I would chop! but the number of
trailing whitespace characters varies and my attempt at a while loop to
check and chop! was unsuccessful.
 
W

William James

Taylor said:
I have files with city names which have one or two trailing whitespaces:

Adelanto <-
Agoura Hills <-
Alameda <-
Albany <-
Alhambra <-
Aliso Viejo <-

My method just iterates and strips!

def trim(state)
diskfile = File.new(state + "-cleaned.txt", "w")
$stdout = diskfile

IO.foreach(state + ".txt") do |line|
line.strip!
puts line
end

diskfile.close
$stdout = STDOUT
end

The output successfully removes leading whitespace but not trailing
whitespace. What am I doing wrong? I would chop! but the number of
trailing whitespace characters varies and my attempt at a while loop to
check and chop! was unsuccessful.

Perhaps there are some control characters at the lines' ends.

The way that you're writing to a file seems roundabout
and peculiar to me.

def trim(state)
open(state + "-cleaned.txt", "w") do |out|
IO.foreach(state + ".txt") do |line|
# The next line will show control characters.
p line
out.puts line.strip
end
end
end
 
M

Morton Goldberg

I have files with city names which have one or two trailing
whitespaces:

Adelanto <-
Agoura Hills <-
Alameda <-
Albany <-
Alhambra <-
Aliso Viejo <-

My method just iterates and strips!

def trim(state)
diskfile = File.new(state + "-cleaned.txt", "w")
$stdout = diskfile

IO.foreach(state + ".txt") do |line|
line.strip!
puts line
end

diskfile.close
$stdout = STDOUT
end

The output successfully removes leading whitespace but not trailing
whitespace. What am I doing wrong? I would chop! but the number of
trailing whitespace characters varies and my attempt at a while
loop to
check and chop! was unsuccessful.

Strip is working as it should. Your input lines don't end is spaces,
but with a line end code. The easy way to do what you want is
something like the following:

<code>
#! /usr/bin/env ruby -w

PREFOX = "/Users/mg/Desktop/test"
SUFFIX = ".txt"
File.open(PREFOX + "-cleaned" + SUFFIX, "w") do |out_file|
File.open(PREFOX + SUFFIX) do |in_file|
in_file.each { |line| out_file.puts line.chomp.strip }
end
end
</code>

Note the use of String#chomp. Also, I'm recommending that you use
File.open and that you don't mess with $stdout. File#open
automatically takes care of closing the files it opens.

Regards, Morton
 
T

Taylor Strait

def trim(state)
open(state + "-cleaned.txt", "w") do |out|
IO.foreach(state + ".txt") do |line|
# The next line will show control characters.
p line
out.puts line.strip
end
end
end

outputs:

"Yorba Linda\240\240\n"
"Yountville \n"
"Yreka\240\240\n"
"Yuba City\240\240\n"
"Yucaipa\240\240\n"
"Yucca Valley "
=> nil

but alas the generated file still has trailing whitespaces. What should
I do to remove the \240 and \n? Is that not what strip! does?
 
T

Taylor Strait

Note the use of String#chomp

Thanks, Morton. That was the key. I just appended two .chomp methods
and it fixed it right up. I appreciate everyone's help!
 
W

William James

Taylor said:
Thanks, Morton. That was the key. I just appended two .chomp methods
and it fixed it right up.

It couldn't have.

strip removes newlines, because they are whitespace.
On the other hand, neither chomp nor strip removes "\240".
=> "foo \240"
 
T

Taylor Strait

It couldn't have.
strip removes newlines, because they are whitespace.
On the other hand, neither chomp nor strip removes "\240".

=> "foo \240"

This is why I shouldn't code at 3:30am! I had used chop instead, which
of course truncated the text in rare cases. How can I remove \240?
 
E

Eric Hodel

This is why I shouldn't code at 3:30am! I had used chop instead,
which
of course truncated the text in rare cases. How can I remove \240?

String#gsub

line.gsub(/[\240]/, '')
 
C

Carlos

This is why I shouldn't code at 3:30am! I had used chop instead, which
of course truncated the text in rare cases. How can I remove \240?

line.delete! "\240"

or, if you want to delete them at the end only,

line.sub! /\240+$/, ""

Good luck.

--
 
W

William James

Taylor said:
This is why I shouldn't code at 3:30am! I had used chop instead, which
of course truncated the text in rare cases. How can I remove \240?

Remove ASCII 128-- 255 at end of line:

irb(main):016:0> "foo\240\250 \n".strip.
irb(main):017:0* sub(/[#{128.chr}-#{255.chr}]+$/,"")
=> "foo"
 
R

Robert Klemme

Taylor said:
This is why I shouldn't code at 3:30am! I had used chop instead, which
of course truncated the text in rare cases. How can I remove \240?

Remove ASCII 128-- 255 at end of line:

irb(main):016:0> "foo\240\250 \n".strip.
irb(main):017:0* sub(/[#{128.chr}-#{255.chr}]+$/,"")
=> "foo"

Why not combine them like this:

irb(main):007:0> s="foo\240\250 \n"
=> "foo\240\250 \n"

irb(main):015:0> s.sub /[\200-\377\s]+$/, ''
=> "foo"

Cheers

robert
 
C

Charles A Gray

This is why I shouldn't code at 3:30am! I had used chop instead,
which
of course truncated the text in rare cases. How can I remove \240?

String#gsub

line.gsub(/[\240]/, '')
line.chop will remove one of the "\240"s. line.chop.chop.chop will
remove all three, but they will still be on line. To completely remove
them, use line.chop!.chop!.chop! where line = the string you wish to
change.
 
C

Chris Gernon

Charles said:
line.chop will remove one of the "\240"s. line.chop.chop.chop will
remove all three, but they will still be on line. To completely remove
them, use line.chop!.chop!.chop! where line = the string you wish to
change.

line = line.chop.chop.chop would be better. In general, you shouldn't
chain destructive methods, because they usually return nil when they
fail:

irb> line = ''
=> ""
irb> line.chop!
=> nil
irb> line = ''
=> ""
irb(main):004:0> line.chop!chop!
TypeError: $_ value need to be String (nil given)
from (irb):4:in `chop!'
from (irb):4

As opposed to:

irb> line = ''
=> ""
irb> line = line.chop.chop.chop
=> ""
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top