[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

regexp conditional

ciapecki

3/19/2008 8:57:00 AM

Hi,

How could I easily do the following?:

input = '111|"aaaa" bbbbb|c'

I would like to get as output following:

output = '111|"""aaa"" bbbbb"|c'

to correct wrongly prepared pipe separated file with enclosing the
equation characters.

thanks
chris
9 Answers

Xavier Noria

3/19/2008 9:09:00 AM

0

On Mar 19, 2008, at 10:00 , ciapecki wrote:
> Hi,
>
> How could I easily do the following?:
>
> input = '111|"aaaa" bbbbb|c'
>
> I would like to get as output following:
>
> output = '111|"""aaa"" bbbbb"|c'
>
> to correct wrongly prepared pipe separated file with enclosing the
> equation characters.

My interpretation of what you need is:

input = '111|"aaaa" bbbbb|c'

fields = input.split('|')
fields[1].gsub!('"', '""')
fields[1] = %Q{"#{fields[1]}"}

output = fields.join('|')

Depending on the input that may not be valid, for example if fields[1]
may contain a pipe. Anyway being a mal-formed input assumptions depend
on the actual data.

-- fxn



ciapecki

3/19/2008 10:21:00 AM

0

On 19 Mrz., 10:09, Xavier Noria <f...@hashref.com> wrote:

> My interpretation of what you need is:
>
> input = '111|"aaaa" bbbbb|c'
>
> fields = input.split('|')
> fields[1].gsub!('"', '""')
> fields[1] = %Q{"#{fields[1]}"}
>
> output = fields.join('|')
>
> Depending on the input that may not be valid, for example if fields[1]
> may contain a pipe. Anyway being a mal-formed input assumptions depend
> on the actual data.
>
> -- fxn


your solution works, and thanks for that,
I am waiting though for a regexp solution,

thanks anyway
chris

Robert Klemme

3/19/2008 9:29:00 PM

0

On 19.03.2008 11:21, ciapecki wrote:
> On 19 Mrz., 10:09, Xavier Noria <f...@hashref.com> wrote:
>
>> My interpretation of what you need is:
>>
>> input = '111|"aaaa" bbbbb|c'
>>
>> fields = input.split('|')
>> fields[1].gsub!('"', '""')
>> fields[1] = %Q{"#{fields[1]}"}
>>
>> output = fields.join('|')
>>
>> Depending on the input that may not be valid, for example if fields[1]
>> may contain a pipe. Anyway being a mal-formed input assumptions depend
>> on the actual data.
>
> your solution works, and thanks for that,
> I am waiting though for a regexp solution,

Even 2 regexps:

irb(main):001:0> input = '111|"aaaa" bbbbb|c'
=> "111|\"aaaa\" bbbbb|c"
irb(main):002:0> input.gsub(/[^|]+/) {|m| m.gsub!(/"/,'""') ?
'"'<<m<<'"' : m}
=> "111|\"\"\"aaaa\"\" bbbbb\"|c"
irb(main):003:0> puts input.gsub(/[^|]+/) {|m| m.gsub!(/"/,'""') ?
'"'<<m<<'"' : m}
111|"""aaaa"" bbbbb"|c
=> nil

Cheers

robert

Paul Mckibbin

3/20/2008 12:17:00 AM

0

Robert Klemme wrote:
>> I am waiting though for a regexp solution,
> Even 2 regexps:
> Cheers
>
> robert

Robert,

How fixed is the input. If it is always of the same format, then what
about:

input = '111|"aaaa" bbbbb|c'
output=input.gsub(/\"/,'""').gsub(/(.*)\|(.*)\|(.*)/,'\1|"\2"|\3')

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

Paul Mckibbin

3/20/2008 12:19:00 AM

0

Paul Mckibbin wrote:
>
> Robert,
>
Oops. I meant Chris of course.

>
> Mac

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

ciapecki

3/20/2008 10:25:00 AM

0

On 20 Mrz., 01:18, Paul Mckibbin <pmckib...@gmail.com> wrote:
> Paul Mckibbin wrote:
>
> > Robert,
>
> Oops. I meant Chris of course.
>
>
>
> > Mac
>
> --
> Posted viahttp://www.ruby-....

Hi Mac,

The format is fixed but contains 49 fields separated by | so your one-
liner could not fit into one line :)

thanks,
chris

ciapecki

3/20/2008 10:32:00 AM

0

On 19 Mrz., 22:28, Robert Klemme <shortcut...@googlemail.com> wrote:
> On 19.03.2008 11:21, ciapecki wrote:
>
>
>
> > On 19 Mrz., 10:09, Xavier Noria <f...@hashref.com> wrote:
>
> >> My interpretation of what you need is:
>
> >> input = '111|"aaaa" bbbbb|c'
>
> >> fields = input.split('|')
> >> fields[1].gsub!('"', '""')
> >> fields[1] = %Q{"#{fields[1]}"}
>
> >> output = fields.join('|')
>
> >> Depending on the input that may not be valid, for example if fields[1]
> >> may contain a pipe. Anyway being a mal-formed input assumptions depend
> >> on the actual data.
>
> > your solution works, and thanks for that,
> > I am waiting though for a regexp solution,
>
> Even 2 regexps:
>
> irb(main):001:0> input = '111|"aaaa" bbbbb|c'
> => "111|\"aaaa\" bbbbb|c"
> irb(main):002:0> input.gsub(/[^|]+/) {|m| m.gsub!(/"/,'""') ?
> '"'<<m<<'"' : m}
> => "111|\"\"\"aaaa\"\" bbbbb\"|c"
> irb(main):003:0> puts input.gsub(/[^|]+/) {|m| m.gsub!(/"/,'""') ?
> '"'<<m<<'"' : m}
> 111|"""aaaa"" bbbbb"|c
> => nil
>
> Cheers
>
> robert

this is just great,
thanks robert for this


chris

Robert Klemme

3/20/2008 12:13:00 PM

0

2008/3/20, ciapecki <ciapecki@gmail.com>:
> On 19 Mrz., 22:28, Robert Klemme <shortcut...@googlemail.com> wrote:
> > On 19.03.2008 11:21, ciapecki wrote:
> >
> >
> >
> > > On 19 Mrz., 10:09, Xavier Noria <f...@hashref.com> wrote:
> >
> > >> My interpretation of what you need is:
> >
> > >> input = '111|"aaaa" bbbbb|c'
> >
> > >> fields = input.split('|')
> > >> fields[1].gsub!('"', '""')
> > >> fields[1] = %Q{"#{fields[1]}"}
> >
> > >> output = fields.join('|')
> >
> > >> Depending on the input that may not be valid, for example if fields[1]
> > >> may contain a pipe. Anyway being a mal-formed input assumptions depend
> > >> on the actual data.
> >
> > > your solution works, and thanks for that,
> > > I am waiting though for a regexp solution,
> >
> > Even 2 regexps:
> >
> > irb(main):001:0> input = '111|"aaaa" bbbbb|c'
> > => "111|\"aaaa\" bbbbb|c"
> > irb(main):002:0> input.gsub(/[^|]+/) {|m| m.gsub!(/"/,'""') ?
> > '"'<<m<<'"' : m}
> > => "111|\"\"\"aaaa\"\" bbbbb\"|c"
> > irb(main):003:0> puts input.gsub(/[^|]+/) {|m| m.gsub!(/"/,'""') ?
> > '"'<<m<<'"' : m}
> > 111|"""aaaa"" bbbbb"|c
> > => nil
> >
> > Cheers
> >
> > robert
>
>
> this is just great,
> thanks robert for this

You're welcome. Btw, this is even better (also faster)

irb(main):003:0> input = '111|"aaaa" bbbbb|c'
=> "111|\"aaaa\" bbbbb|c"
irb(main):004:0> input.gsub(/"/,'""').gsub(/[^|]*"[^|]*/,'"\\&"')
=> "111|\"\"\"aaaa\"\" bbbbb\"|c"
irb(main):005:0> puts input.gsub(/"/,'""').gsub(/[^|]*"[^|]*/,'"\\&"')
111|"""aaaa"" bbbbb"|c
=> nil

This could even be a bit faster:

irb(main):006:0> input.gsub(/"/,'""').gsub(/[^|"]*"[^|]*/,'"\\&"')
=> "111|\"\"\"aaaa\"\" bbbbb\"|c"

Kind regards

robert

--
use.inject do |as, often| as.you_can - without end

Paul Mckibbin

3/20/2008 12:31:00 PM

0

ciapecki wrote:
>
> The format is fixed but contains 49 fields separated by | so your one-
> liner could not fit into one line :)

A minor change :)

input = '111|"aaaa" bbbbb|c|"22222" asdasd|ddd|"aaaa"qqqqq|jjjj'
output=input.gsub(/"/,'""').gsub(/(.*?)\|(.*?)\|(.*?)/,'\1|"\2"|\3')

=>111|"""aaaa"" bbbbb"|c|"""22222"" asdasd"|ddd|"""aaaa""qqqqq"|jjjj

This was just to point out that there is no need for multiple replace
options, but you need to know the layout is correct and in a given
pattern. Robert's is the better and more robust solution (and also
shorter).

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