BackgroundWorker C#,从txt文件中读取 - 写入csv

时间:2013-08-20 12:14:50

标签: c# multithreading backgroundworker

下面的代码实际上做了我想要它做的事情但是我正在努力使它最优化,因为我仍在学习BackgroundWorker等我认为你可以给我一些提示。麻烦的是我可以运行该程序,但因为它是一个相当长的操作(1000个+每个文本文件的行数),它只是在程序完成之后才能更新进度条或标签。有2个progreesbars,一个用于处理的文本文件数,另一个用于处理过程中文本文件读取的行数。

namespace myParser
{
    public partial class Form1 : Form
{

    string filePath;
    string[] files;

    public Form1()
    {
        InitializeComponent();

        pbFilesProcessed.Visible = false;
        pbLinesProcessed.Visible = false;
        btnParse.Visible = false;
        lbProcessedFiles.Visible = false;
        lbProcessedLines.Visible = false;
    }

    private void btnOpen_Click(object sender, EventArgs e)
    {
        DialogResult result = folderBrowserDialog1.ShowDialog();
        if (result == DialogResult.OK)
        {
            //counts the number of files in the folder
            files = Directory.GetFiles(folderBrowserDialog1.SelectedPath);

            filePath = folderBrowserDialog1.SelectedPath.ToString();

            char[] delimiterChars = { '\\' };
            string[] filePathParts = filePath.Split(delimiterChars);

            string folder = filePathParts[4];

            tbFolderName.Text = folder;

            btnParse.Visible = true;
        }
    }

    private void btnParse_Click(object sender, EventArgs e)
    {
        btnParse.Visible = false;

        lbProcessedFiles.Visible = true;
        pbFilesProcessed.Visible = true;
        lbProcessedLines.Visible = true;
        pbLinesProcessed.Visible = true;
        lbProcessedLines.Text = "Lines: 0 / 0";

        int fileCount = 1;

        foreach (var csvFile in Directory.GetFiles(folderBrowserDialog1.SelectedPath))
        {
            pbFilesProcessed.Maximum = Convert.ToInt32(files.Length.ToString());

            string fileName = "Waveforms.csv";

            int lineCount = 0;

            string lines;

            string newLines;              

            string csvFullFilePath = csvFile.ToString();
            string[] filePathSplit = csvFullFilePath.Split('\\');
            string pointName = filePathSplit[4].ToString();

            string[] pathDirectionSplit = filePathSplit[5].ToString().Split('_');
            string[] swingDirectionSplit = pathDirectionSplit[3].Split('.');
            string swingDirection = swingDirectionSplit[0];


            var numberOfLines = File.ReadLines(csvFile).Count();

            using (StreamReader r = new StreamReader(csvFile))
            {
                while ((lines = r.ReadLine()) != null)
                {
                    pbLinesProcessed.Maximum = Convert.ToInt32(numberOfLines.ToString());

                    if (lineCount == 0)
                    {
                        lines.Remove(0);
                        lineCount++;
                    }
                    else
                    {
                        newLines = Regex.Replace(lines, ",{2,}", ",").ToString();
                        File.AppendAllText(@"Simulator\\" + fileName, pointName + "," + swingDirection + "," + newLines + System.Environment.NewLine);

                        pbLinesProcessed.PerformStep();
                        lbProcessedLines.Text = "Lines: " + lineCount + "/" + Convert.ToInt32(numberOfLines.ToString()); 

                        lineCount++;                                  
                    }
                }
                r.Close();
            }
            pbFilesProcessed.PerformStep();
            lbProcessedFiles.Text = "Files: " + fileCount.ToString() + "/" + files.Length.ToString();
            fileCount++;
        }
        btnParse.Visible = false;
        MessageBox.Show("Done");
    }  
}

}

2 个答案:

答案 0 :(得分:2)

对,经过一个小时左右,这就是我所做的。不是最优雅的,因为我仍然是新手感谢nim(MSDN Link)。但是我无法在进度条上显示正确的进度.....

namespace myParser
{
public partial class Form1 : Form
{
    string filePath;
    string[] files;
    int fileCount = 0;
    int numberOfFiles;
    int lineCount = 0;
    int numberOfLines;

    public Form1()
    {
        InitializeComponent();

        pbFilesProcessed.Visible = false;
        pbLinesProcessed.Visible = false;
        btnParse.Visible = false;
        lbProcessedFiles.Visible = false;
        lbProcessedLines.Visible = false;
    }

    private void btnOpen_Click(object sender, EventArgs e)
    {
        DialogResult result = folderBrowserDialog1.ShowDialog();
        if (result == DialogResult.OK)
        {
            //counts the number of files in the folder
            files = Directory.GetFiles(folderBrowserDialog1.SelectedPath);

            filePath = folderBrowserDialog1.SelectedPath.ToString();

            char[] delimiterChars = { '\\' };
            string[] filePathParts = filePath.Split(delimiterChars);

            string folder = filePathParts[4];

            tbFolderName.Text = folder;

            btnParse.Visible = true;
        }
    }

    private void btnParse_Click(object sender, EventArgs e)
    {
        btnParse.Visible = false;
        btnOpen.Visible = false;

        lbProcessedFiles.Visible = true;
        pbFilesProcessed.Visible = true;
        lbProcessedLines.Visible = true;
        pbLinesProcessed.Visible = true;
        lbProcessedLines.Text = "Lines: 0 / 0";

        pbFilesProcessed.Maximum = Convert.ToInt32(files.Length.ToString());

        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {

        foreach (var csvFile in Directory.GetFiles(folderBrowserDialog1.SelectedPath))
        {
            numberOfFiles = Convert.ToInt32(files.Length.ToString());

            string fileName = "Waveforms.csv";
            lineCount = 0;
            string lines;
            string newLines;
            string csvFullFilePath = csvFile.ToString();
            string[] filePathSplit = csvFullFilePath.Split('\\');
            string pointName = filePathSplit[4].ToString();
            string[] pathDirectionSplit = filePathSplit[5].ToString().Split('_');
            string[] swingDirectionSplit = pathDirectionSplit[3].Split('.');
            string swingDirection = swingDirectionSplit[0];

            numberOfLines = File.ReadLines(csvFile).Count();

            using (StreamReader r = new StreamReader(csvFile))
            {
                while ((lines = r.ReadLine()) != null)
                {
                    if (lineCount == 0)
                    {
                        lines.Remove(0);
                        lineCount++;
                    }
                    else
                    {
                        newLines = Regex.Replace(lines, ",{2,}", ",").ToString();
                        File.AppendAllText(@"Simulator\\" + fileName, pointName + "," + swingDirection + "," + newLines + System.Environment.NewLine);
                        backgroundWorker1.ReportProgress(lineCount);
                        lineCount++;
                    }
                }
                r.Close();
            }
            backgroundWorker1.ReportProgress(fileCount);
            fileCount++;
        }
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        pbFilesProcessed.PerformStep();
        lbProcessedFiles.Text = "Files: " + fileCount.ToString() + "/" + files.Length.ToString();
        pbLinesProcessed.PerformStep();
        lbProcessedLines.Text = "Lines: " + lineCount + "/" + Convert.ToInt32(numberOfLines.ToString());
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        btnParse.Visible = false;
        MessageBox.Show("Done");
        btnOpen.Visible = true;
    }  
}

}

答案 1 :(得分:0)

请参阅MSDN documentation on BackgroundWorker

页面底部附近有一个非常短但很好的示例代码。