JakeyCakes
asked on
Matching string (populated via an embedded resouce) with Regex to populate a hashtable with three columns
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+),(<?:compan y-name>\W+ ),(<?:shar e-descript ion>\W+)\n "))...
any help greatly appreciated.
The code:
public class Values
{
}
public void TestVoid()
{
string result = GetResource ( "Digita.Importers.CoTax.Pe rTax.ISINl ist.csv" ); //this reads the embedded resource fine
System.Collections.Hashtab le table = new System.Collections.Hashtab le();
//this is one of the problems - no matches are made
foreach( Match match in Regex.Matches( result,
@"(<?:isin>\W+),(<?:compan y-name>\W+ ),(<?:shar e-descript ion>\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 );
}
}
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+),(<?:compan
any help greatly appreciated.
The code:
public class Values
{
}
public void TestVoid()
{
string result = GetResource ( "Digita.Importers.CoTax.Pe
System.Collections.Hashtab
//this is one of the problems - no matches are made
foreach( Match match in Regex.Matches( result,
@"(<?:isin>\W+),(<?:compan
{
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 );
}
}
ASKER
Fernando,
the string format is :
"TE0123456789,TEST Ltd.,TEST SHARE1\r\nTEN0123456789,Te sted N.V.,Test share2\r\n"
HTH
the string format is :
"TE0123456789,TEST Ltd.,TEST SHARE1\r\nTEN0123456789,Te
HTH
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
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?
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?
ASKER
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[compan y].ToStrin g(),quoteR eplace ( 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?
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(
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[compan
{
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?
ASKER
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.
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.
Hi JakeyCakes;
Regex.IsMatch(table[compan y].ToStrin g(),quoteR eplace ( 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[compan y].ToStrin g(), 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[compan y].ToStrin g(), escapedStr, RegexOptions.IgnoreCase))
That is the only thing that I can see that would cause it not to match correctly.
Fernando
Regex.IsMatch(table[compan
Where:
1 table[company].ToString() Is the string to be searched.
2 quoteReplace ( row.ItemArray[2].ToString(
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[compan
If using VS before 2005
string escape = @"(\.|\^|\[|\{|\(|\||\)|\*
string escapedStr = Regex.Replace(quoteReplace
if ( Regex.IsMatch(table[compan
That is the only thing that I can see that would cause it not to match correctly.
Fernando
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