|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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,NUL L,,, 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-forum.com/. |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
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,NUL L,,, > > 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 |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
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-forum.com/. |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
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-forum.com/. |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
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-forum.com/. |
|
![]() |
| Outils de la discussion | |
|
|