Improve company productivity with a Business Account.Sign Up

x
?
Solved

Matching string (populated via an embedded resouce) with Regex to populate a hashtable with three columns

Posted on 2006-11-28
7
Medium Priority
?
297 Views
Last Modified: 2010-04-16
Hi,

I want to populate a hashtable with three columns (Isin, company-name, share-description) which I will use for textual and phonetic comparisons with data in a dataset. I know the syntax is incorrect, but am unsure what the Regex syntax particularly the foreach( Match match in      Regex.Matches( result,
                        @"(<?:isin>\W+),(<?:company-name>\W+),(<?:share-description>\W+)\n"))...

any help greatly appreciated.

The code:

public class Values
            {
            }

            public void TestVoid()
            {
                  string result = GetResource ( "Digita.Importers.CoTax.PerTax.ISINlist.csv" ); //this reads the embedded resource fine


                  System.Collections.Hashtable table = new System.Collections.Hashtable();
                                               
                                                //this is one of the problems - no matches are made
                  foreach( Match match in      Regex.Matches( result,
                        @"(<?:isin>\W+),(<?:company-name>\W+),(<?:share-description>\W+)\n"))
                  {
                        string isin = match.Groups[ "isin" ].ToString();
        string company = match.Groups[ "company-name" ].ToString();
                        string share = match.Groups[ "share-description" ].ToString();
                        
                                          //this also causes an error
                        table[ isin ] = new Values( isin, company-name, share-description );
                  }
}
0
Comment
Question by:JakeyCakes
  • 4
  • 3
7 Comments
 
LVL 64

Expert Comment

by:Fernando Soto
ID: 18029363
Hi JakeyCakes;

What is the format of this string, result, which is the results of reading in the resource file? This is needed to know how to set up the Regex object correctly.

Fernando
0
 

Author Comment

by:JakeyCakes
ID: 18029464
Fernando,

the string format is :

"TE0123456789,TEST Ltd.,TEST SHARE1\r\nTEN0123456789,Tested N.V.,Test share2\r\n"

HTH
0
 
LVL 64

Accepted Solution

by:
Fernando Soto earned 2000 total points
ID: 18030160
Hi JakeyCakes;

Try it this way.

      public void TestVoid()
      {
            string result = GetResource ( "Digita.Importers.CoTax.PerTax.ISINlist.csv" ); //this reads the embedded resource fine
            MatchCollection mc = Regex.Matches(result,
                        @"(?<isin>[^,]+),(?<company>[^,]+),(?<share>(?:[^\r]+))");

            System.Collections.Hashtable table = new System.Collections.Hashtable();
                                               
            //this is one of the problems - no matches are made
            foreach( Match m in mc)
            {
                  string isin = m.Groups["isin"].Value;
                  string company = m.Groups["company"].Value;
                  string share = m.Groups["share"].Value;
                   
                  //this also causes an error
                  table[ isin ] = new Values( isin, company, share );
            }
      }


Fernando
0
Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 

Author Comment

by:JakeyCakes
ID: 18035254
Fernando,

this line of code -  table[ isin ] = new Values( isin, company, share ); - causes this error : No overload for method 'Values' takes '3' arguments. How can I resolve this?
0
 

Author Comment

by:JakeyCakes
ID: 18036263
Fernando I think I have resolved the above by doing:

table[isin] = isin;
table[company] =company;
table[share] = share;

I now have a related regex problem (and I know strictly speaking I should ask a new question, but as its related ... ):

in the DataRow row in the populated DataSet a, I want to use the Hashtable for comparision purposes, in otherwords if any value in the table[company]  case-insensitively matches the value in the row.ItemArray[2].ToString() (the company name), i want the specified strings populated as follows:

Company = the value of table[company],
strISIN = the value of table[isin],
Description = the value of table[share]

I have tried

foreach ( DataRow row in a.Tables[0].Rows )
                        {
                        if ( Regex.IsMatch(table[company].ToString(),quoteReplace ( row.ItemArray[2].ToString() ),RegexOptions.IgnoreCase))
                                                      {
                                                            Company =  table[company].ToString()                                                             strISIN =  table[isin].ToString();
                                                            Description = table[share].ToString()                                                       }
                                                      else
                                                      {
                              Company = row.ItemArray[2].ToString()
                                                      }

to no avail. Do you have any suggestions?
0
 

Author Comment

by:JakeyCakes
ID: 18036841
Fernando,

I have decided that it wasn't fair of me to ask you to tackle a new issue - which I have posted as a new question - when you actually had resolved my original problem, so the points are yours.

Thank your very much for your assistance.
0
 
LVL 64

Expert Comment

by:Fernando Soto
ID: 18036913
Hi JakeyCakes;

Regex.IsMatch(table[company].ToString(),quoteReplace ( row.ItemArray[2].ToString() ),RegexOptions.IgnoreCase))

Where:
1       table[company].ToString() Is the string to be searched.
2       quoteReplace ( row.ItemArray[2].ToString() ) Is the string to match

Item 2 above may cause a no match to be found or a invalid match to be found. This will happen if the string that holds the match pattern, item 2 above, has any of the following characters. ==>  . $ ^ {  [ ( | ) * + ? \  <==. These characters have a special meaning in the Regex language and therefore needs to be escaped before using them. To escape the characters in the string do one of the following:

If using VS 2005

        string escapedStr = Regex.Escape(quoteReplace ( row.ItemArray[2].ToString() ))
        if ( Regex.IsMatch(table[company].ToString(), escapedStr, RegexOptions.IgnoreCase))


If using VS before 2005

        string escape = @"(\.|\^|\[|\{|\(|\||\)|\*|\+|\?|\\)";
        string escapedStr = Regex.Replace(quoteReplace ( row.ItemArray[2].ToString() ), escape, "\$1");
        if ( Regex.IsMatch(table[company].ToString(), escapedStr, RegexOptions.IgnoreCase))

That is the only thing that I can see that would cause it not to match correctly.

Fernando
0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Introduction Hi all and welcome to my first article on Experts Exchange. A while ago, someone asked me if i could do some tutorials on object oriented programming. I decided to do them on C#. Now you may ask me, why's that? Well, one of the re…
Performance in games development is paramount: every microsecond counts to be able to do everything in less than 33ms (aiming at 16ms). C# foreach statement is one of the worst performance killers, and here I explain why.
When you have multiple client accounts to manage, it often feels like there aren’t enough hours in the day. With too many applications to juggle, you can’t focus on your clients, much less your growing to-do list. But that doesn’t have to be the cas…
Watch the video to know the simple way to remove or recover or reset lost or forgotten passwords of Outlook PST file. With Kernel Outlook Password Recovery tool such operation is very easy to perform. It is a freeware with limitation to use with 500…

602 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question