help needed using a regex .sub

P

Peter Vanderhaden

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
 
A

Alex LeDonne

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
 
P

Peter Vanderhaden

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 said:
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
 
7

7stud --

Peter said:
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
 
7

7stud --

7stud said:
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(?,)
 

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

Forum statistics

Threads
473,733
Messages
2,569,439
Members
44,829
Latest member
PIXThurman

Latest Threads

Top