1

名前付き見出しが重複しているタブ区切りファイルがあります。

[Column1] \t [Column2] \t [test] \t [test] \t [test] \t [test] \t [Column3] \t [Column4]

私がやりたいのは、複製された列の名前を変更することです [test] 整数で。だから次のようになります

[Column1] \t [Column2] \t [test1] \t [test2] \t [test3] \t [test4] \t [Column3] \t [Column4]

これまでのところ、最初の行を分離できます。次に、見つけた一致を数えます

string destinationUnformmatedFileName = @"C:\New\20130816_Opportunities_unFormatted.txt";
string destinationFormattedFileName = @"C:\New\20130816_Opportunities_Formatted.txt";
var unformattedFileStream = File.Open(destinationUnformmatedFileName, FileMode.Open, FileAccess.Read);  // Open (unformatted) file for reading
var formattedFileStream = File.Open(destinationFormattedFileName, FileMode.Create, FileAccess.Write);   // Create (formattedFile) for writing

StreamReader sr = new StreamReader(unformattedFileStream);
StreamWriter sw = new StreamWriter(formattedFileStream);

int rowCounter = 0;
// Read each row in the unformatted file
while ((currentRow = sr.ReadLine()) != null)
{
    //First row, lets check for duplicate names
    if (rowCounter = 0)
    {

    // Write column name to array
    string delimiter = "\t";
    string[] fieldNames = currentRow.Split(delimiter.ToCharArray());

    foreach (string fieldName in fieldNames)
    {
        // fieldName must be followed by a tab for it to be a duplicate
        // original code - causing the issue
        //Regex rgx = new Regex("\\t(" + fieldName + ")\\t");
        // Edit - resolved the issue
        Regex rgx = new Regex("(?<=\\t|^)(" + fieldName + ")(\\t)+");   

        // Count how many occurances of fieldName in currentRow
        int count = rgx.Matches(currentRow).Count;               
        //MessageBox.Show("Match Count = " + count.ToString());

        // If we have a duplicate field name 
        if (count > 1)                                           
        {
             string newFieldName = "\t" + fieldName + count.ToString() + "\t";
             //MessageBox.Show(newFieldName);
             currentRow = rgx.Replace(currentRow, newFieldName, 1);   
         }
     }
     }
rowCounter++;
}

私は正しい方向に進んでいると思いますが、正規表現が正しく機能しているとは思いませんか?

編集:使用してパターンを見つける方法を理解したと思います;

Regex rgx = new Regex("(?<=\\t|^)(" + fieldName + ")(\\t)+"); 

それは契約を破るものではありませんが、唯一の問題はそれがラベル付けされていることです。

[Column1] \t [Column2] \t [test4] \t [test3] \t [test2] \t [test] \t [Column3] \t [Column4]

それ以外の

[Column1] \t [Column2] \t [test1] \t [test2] \t [test3] \t [test4] \t [Column3] \t [Column4]
4

3 に答える 3

0

最初にRegExrで正規表現をテストします。「\t」は特殊文字だと思います。「\\t」を試してください。C# では、「\\\\t」になります。

于 2013-08-27T00:27:45.193 に答える