根据内容将txt文件解析为多个单独的文件

时间:2017-09-26 15:13:25

标签: c# parsing writealltext

我在创建最后一个文件时遇到问题。

我有一个制表符分隔的文本文件,如下所示。

KABEL   Provkanna for Windchill_NWF-TSNM    =2212.U001+++-X2    PXC.2400016             =2271.U004+++-X1    Test_Created_in_WT              =2212-W123  RXF 4x25    0000000440  Cable RXF 4x25
PART        01      1   1       
PART        02      2   2       
PART        03      3   3       
PART        04      4   4       
PART        SH      GND GND     
KABEL   Provkanna for Windchill_NWF-TSNM    =2212.U001+++-X2    PXC.2400016             =2271.U004+++-X1    Test_Created_in_WT              =2212-W124  RXF 4x35    0000000456  Cable RXF 4x35
PART        01  1   5   5       
PART        02  1   6   6       
PART        03  1   7   7       
PART        04  1   8   8       
PART        SH  1   GND GND     
KABEL   Provkanna for Windchill_NWF-TSNM    =2212.U001+++-X2    PXC.2400016             =2271.U004+++-X1    Test_Created_in_WT              =2212-W125  RXF 4x35    0000000456  Cable RXF 4x35
PART        01  1   9   9       
PART        02  1   10  10      
PART        03  1   11  11      
PART        04  1   12  12      
PART        SH  1   GND GND     

基本上它是一行以Word KABEL开头,后跟一些制表符分隔的列。 然后这一行后跟一些以PART开头的行。 以PART开头的行数可以不同。

现在我希望将此文件分解为多个文件。

每个已解析的文件都应包含一个名称,该名称包含以KABEL开头的行的某一列的信息。 在该文件中,应添加以PART开头的每一行。

然后当一条用KABEL凝视的线再次出现时,将创建一个新文件并将PART行添加到该文件中...依此类推......等等。

我经常尝试过很多次,最终找到了正确创建前两个文件的方法......但是......最后一个文件不会被创建。

我的脚本读取并查找并显示了应该是最后一个解析的输出文件的唯一部分的正确列,但我没有看到任何文件正在输出。

任何接受者?因为我被卡住了,所以我非常赞赏你的帮助......

{
    string line ="";
    string ColumnValue ="";
    string Starttext = "PART";
    string Kabeltext = "KABEL";
    int column = 16;     
    string FilenameWithoutCabelNumber = @"C:\Users\tsnm2171\Desktop\processed\LABB\OUTPUT - Provkanna for Windchill_NWF-TSNM_2212_CABLE_CONNECTION";
    string ExportfileIncCablenumber ="";
    string filecontent ="";

    using (System.IO.StreamReader reader = new System.IO.StreamReader(@"C:\Users\tsnm2171\Desktop\processed\LABB\Provkanna for Windchill_NWF-TSNM_2212_CABLE_CONNECTION.txt"))          
    {       
        line = reader.ReadLine();

        //Set columninnehåll till filnamn (String ColumnValue)   
        string [] words = line.Split();
        ColumnValue = words[column];

        MessageBox.Show (ColumnValue);

        while (line != null)                        
        {   
            line = reader.ReadLine();

            if (line.StartsWith(Kabeltext)) // if line starts with KABEL 
            {   
                ExportfileIncCablenumber =  (FilenameWithoutCabelNumber + "-" + ColumnValue + ".txt");
                System.IO.File.WriteAllText(ExportfileIncCablenumber, filecontent);

                filecontent = string.Empty;
                string [] words2 = line.Split();
                ColumnValue = words2[column];

                MessageBox.Show("Ny fil " + ColumnValue);
            }
            else if (line.StartsWith(Starttext)) // if line starts with PART
            {
                filecontent += ((line)+"\n");           //writes the active line                                
            }                   
        }
        ExportfileIncCablenumber =  (FilenameWithoutCabelNumber + "-" + ColumnValue + ".txt");
        System.IO.File.WriteAllText(ExportfileIncCablenumber, filecontent);                     filecontent = "";                                                                   
    }
}

提前致谢

托马斯

1 个答案:

答案 0 :(得分:0)

首先,您应该像这样读取行和空检查模式 while((line = reader.ReadLine()) != )因为它可以保护您免受空引用。 我的版本似乎有效:

{
        const string StartText                  = "PART";
        const string KabelText                  = "KABEL";  
        const string FilenameWithoutCabelNumber = @"...\";

        string fileContent = "";
        int    fileNumber  = 0;

        using (StreamReader reader = File.OpenText(@"...\file.txt"))
        {       
            string line = reader.ReadLine();
            string columnValue = GetParticularColumnName(line);
            //Set columninnehåll till filnamn (String ColumnValue)   
            MessageBox.Show (ColumnValue);

            var ExportfileIncCablenumber ="";
            while ((line = reader.ReadLine()) != null)         
            {   
                if (line.StartsWith(KabelText)) // if line starts with KABEL 
                {   
                    ExportfileIncCablenumber =  $"{FilenameWithoutCabelNumber}-{columnValue}({fileNumber}).txt";

                    File.WriteAllText(ExportfileIncCablenumber, fileContent);

                    fileContent = string.Empty;
                    columnValue = GetParticularColumnName(line);
                    fileNumber++;
                }
                else if (line.StartsWith(StartText)) // if line starts with PART
                {
                    fileContent += ((line)+Environment.NewLine);    //writes the active line                                
                }                   
            }

            ExportfileIncCablenumber =  (FilenameWithoutCabelNumber + "-" + columnValue + ".txt");
            File.WriteAllText(ExportfileIncCablenumber, fileContent);
        }
    }

    private static string GetParticularColumnName(string line)
    {
        return line.Split(' ').Last();
    }

保存文件时遇到的问题是因为误解了String.Split()的工作原理。有关详细信息,请参阅docs,但要简短说明:

  

如果separator参数为null或不包含任何字符,则   method将空格字符视为分隔符。

这就是为什么你有一个带有单词和空字符串的数组的原因。 column正在选择空字符串,这就是为什么你有一个文件覆盖另一个文件的原因。 (列值16也是错误的,实际上有15个单词)。你的所有线条都被连接在一起,因为窗户不会对待这些线条。\ n'作为终点字符,这就是我使用Environment.NewLine的原因 最后但并非最不重要的问题是您的代码风格。真的,你应该坚持.Net的常见coding conventions,因为这会使你的代码连贯一致,更具可读性。