[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

help needed using a regex .sub

Peter Vanderhaden

11/22/2007 1:33:00 PM

I'm trying to insert a NULL between the first pair of commas in the line
below if it's not already there.

Before: PWCLLP-243-00000002,,Images\1\pwcllp_243_00000002.tif,,,,

After: PWCLLP-243-00000002,NULL,Images\1\pwcllp_243_00000002.tif,,,,

I want to replace only the first instance of ,, on the line with ,NULL,

I can do that with: @record.sub!(',,',',NULL,')

The problem is if the record already has NULL between those 2 commas,
I'd get:

PWCLLP-243-00000002,NULL,Images\1\pwcllp_243_00000002.tif,NULL,,,

I tried this: @record.sub!('\[[:digit:]],,',',NULL,')

I figured that would replace the first instance of a digit followed by 2
commas, but it doesn't work. I'm assuming my syntax is incorrect, but
I've tried all variations I can think of. Anyone out there have any
ideas? I'd be very grateful!
PV
--
Posted via http://www.ruby-....

4 Answers

Alex LeDonne

11/22/2007 3:28:00 PM

0

On Nov 22, 2007 6:33 AM, Peter Vanderhaden <bostonantifan@yahoo.com> wrote:
> I'm trying to insert a NULL between the first pair of commas in the line
> below if it's not already there.
>
> Before: PWCLLP-243-00000002,,Images\1\pwcllp_243_00000002.tif,,,,
>
> After: PWCLLP-243-00000002,NULL,Images\1\pwcllp_243_00000002.tif,,,,
>
> I want to replace only the first instance of ,, on the line with ,NULL,
>
> I can do that with: @record.sub!(',,',',NULL,')
>
> The problem is if the record already has NULL between those 2 commas,
> I'd get:
>
> PWCLLP-243-00000002,NULL,Images\1\pwcllp_243_00000002.tif,NULL,,,
>
> I tried this: @record.sub!('\[[:digit:]],,',',NULL,')
>
> I figured that would replace the first instance of a digit followed by 2
> commas, but it doesn't work. I'm assuming my syntax is incorrect, but
> I've tried all variations I can think of. Anyone out there have any
> ideas? I'd be very grateful!
> PV

You might want to use a CSV library, like FasterCSV. But if you don't
want that overhead and really want to use a regex...

When you say the "first instance of ,,", do you really mean "only if
the first comma on the line is immediately followed by another comma"?

@record.sub!(/^([^,]*),,/, '\1,NULL,')

That regex is: Start at the beginning of the line, match all the
non-comma characters, followed by 2 commas.
The replacement is: All the non-comma characters, then ',NULL,'
instead of the two commas.

-Alex

Peter Vanderhaden

11/23/2007 12:25:00 PM

0

Alex,
Your solution is exactly what I need, thank you very much! I'm getting
better with regular expressions the more I work with them, and I really
appreciate your explanation of this regex.
PV

Alex LeDonne wrote:
> On Nov 22, 2007 6:33 AM, Peter Vanderhaden <bostonantifan@yahoo.com>
> wrote:
>>
>> ideas? I'd be very grateful!
>> PV
>
> You might want to use a CSV library, like FasterCSV. But if you don't
> want that overhead and really want to use a regex...
>
> When you say the "first instance of ,,", do you really mean "only if
> the first comma on the line is immediately followed by another comma"?
>
> @record.sub!(/^([^,]*),,/, '\1,NULL,')
>
> That regex is: Start at the beginning of the line, match all the
> non-comma characters, followed by 2 commas.
> The replacement is: All the non-comma characters, then ',NULL,'
> instead of the two commas.
>
> -Alex

--
Posted via http://www.ruby-....

7stud --

11/23/2007 7:05:00 PM

0

Peter Vanderhaden wrote:
> Alex,
> Your solution is exactly what I need, thank you very much! I'm getting
> better with regular expressions the more I work with them, and I really
> appreciate your explanation of this regex.
> PV

On my system, this solution is 80% faster, and if your strings get
longer it will be faster still:

str = 'PWCLLP-243-00000002,,Images\1\pwcllp_243_00000002.tif,,,,'

first_comma_pos = str.index(',')
next_char_pos = first_comma_pos + 1

if str[next_char_pos] == ?,
str.insert(next_char_pos, 'NULL')
end

puts str


--
Posted via http://www.ruby-....

7stud --

11/23/2007 7:11:00 PM

0

7stud -- wrote:
> On my system, this solution is 80% faster, and if your strings get
> longer it will be faster still:
>
> first_comma_pos = str.index(',')

...and twice as fast with this additional change:

first_comma_pos = str.index(?,)
--
Posted via http://www.ruby-....