comparing two text files

2020-04-26 16:53发布

问题:

I have two text files bala.txt and bala1.txt

bala.txt contains text line by line as

balamurugan,rajendran,chendurpandian
christopher
updateba

bala1.txt contains text line by line as

ba

Here i need to check bala1.txt with bala.txt and write into a log file as

LineNo : 0 : balamurugan,rajendran,chendurpandian
LineNo : 2 : updateba

now its writing only one line as

LineNo : 0 : balamurugan,rajendran,chendurpandian

after that while loop is getting out

Here is my code

while (((line = file.ReadLine()) != null & (line2 = file2.ReadLine()) != null))
                        {
                            if (line.Contains(line2))
                            {
                                dest.WriteLine("LineNo : " + counter.ToString() + " : " + line + "<br />");
                            }
                            counter++;
                        }

any suggestion??

EDIT:

string FilePath = txtBoxInput.Text;
    string Filepath2 = TextBox1.Text;
    int counter = 0;
    string line;
    string line2;


        DirectoryInfo Folder = new DirectoryInfo(textboxPath.Text);
        var dir = @"D:\New folder\log";

        if (Folder.Exists)
        {
            if (!Directory.Exists(dir))
                Directory.CreateDirectory(dir);
        }
        if (File.Exists(FilePath) & File.Exists(Filepath2))
        {
            // Read the file and display it line by line.
            using (var file = File.OpenText(FilePath))
            using (var file2 = File.OpenText(Filepath2))
            using (var dest = File.AppendText(Path.Combine(dir, "log.txt")))
            {
                while (((line = file.ReadLine()) != null & (line2 = file2.ReadLine()) != null))
                {
                    if (line.Contains(line2))
                    {
                        dest.WriteLine("LineNo : " + counter.ToString() + " : " + line + "<br />");
                    }

                    counter++;
                }

            }

}

EDIT(2): I need to create two text files into the folder log and write into that text files as ba.txt with contents as

LineNo : 0 : balamurugan,rajendran,chendurpandian
LineNo : 2 : updateba

and ra.txt with contents as

LineNo : 0 : balamurugan,rajendran,chendurpandian

Any Suggestion??

EDIT(3): I need to create a folder named Log through code and in that log folder ba.txt and ra.txt have to be created.

回答1:

try this:

string FilePath = txtBoxInput.Text, Filepath2 = TextBox1.Text;
int counter = 0;
string line, line2;

DirectoryInfo Folder = new DirectoryInfo(textboxPath.Text);
var dir = @"D:\New folder\log";

if (Folder.Exists)
    if (!Directory.Exists(dir)) Directory.CreateDirectory(dir);

if (File.Exists(FilePath) && File.Exists(Filepath2))
{   // Read the file and display it line by line.
    using (var file = File.OpenText(FilePath))
    {
        using (var file2 = File.OpenText(Filepath2))
        {
            while((line2 = file2.ReadLine()) != null)
            {
                //YOU NEED TO CHECK IF FILE ALREADY EXISTS
                // AND YOU WANT TO OVERWRITE OR CREATE NEW
                //WITH SOME OTHER NAME
                //---------------------------------------CREATE NEW FILE FOR
                //---------------------------------------EACH LINE IN file2
                using (var dest = File.AppendText(Path.Combine(dir, line2 + ".txt")))
                {
                    while ((line = file.ReadLine()) != null)
                    {
                        if (line.Contains(line2))
                            dest.WriteLine("LineNo : " + 
                                counter.ToString() + " : " + line + "<br />");
                        counter++;
                    }
                    //IF THE SECOND FILE ONLY CONTAINS 1 LINE THEN YOU
                    //DON'T NEED THIS.
                    //we need to go to begning of first file
                    file.BaseStream.Seek(0, SeekOrigin.Begin);
                    counter = 0;
                }
            }
        }
    }
}

EDIT: to get file path from user.

Give a button to open file dialog box to chose file or folder browser dialog if you want to get directory name to save log files.

//OPEN FILE -- you will need two buttons one 
//for each text boxes
void btnFile_Click(object sender, EventArgs e)
{
    var fbd = new OpenFileDialog();
    fbd.Multiselect = false;
    fbd.CheckFileExists = true;
    fbd.CheckPathExists = true;
    if(fbd.ShowDialog()==DialogResult.Ok)
    {
        textBox1.Text = fbd.FileName;
    }
}

//SELECT FOLDER
string _logFolderPath;//use this inplace of @"D:\new folder\log";
void btnFolder_click(object sender, EventArgs e)
{
    var fd = new FolderBrowserDialog();
    if(fd.ShowDialog()==DialogResult.OK)
    {
        _logFolderPath = fd.SelectedPath;
    }
}


回答2:

The underlying stream for the second file reader is reaching the end of the stream and not being reset before the next iteration of the loop. You'll need to copy all the lines of each file into memory before comparing them. Try this:

List<string> file1Lines = new List<string>();
List<string> file2Lines = new List<string>();

while ((line = file.ReadLine()) != null)
{
    file1Lines.Add(line);
}

while ((line2 = file2.ReadLine()) != null)
{
    file2Lines.Add(line2);
}

foreach (string f1line in file1Lines)
{
    foreach (string f2line in file2Lines)
    {
        if (f1line.Contains(f2line))
        {
            dest.WriteLine("LineNo : " + counter.ToString() + " : " + f1line + "<br />");
        }

    }
    counter++;
}


回答3:

private void Comparer(string fileLocation1, string fileLocation2, string resultLocation)
{
    StreamReader source = new StreamReader(fileLocation1);
    StreamReader pattern = new StreamReader(fileLocation2);
    StreamWriter result = File.CreateText(resultLocation);

    //reading patterns
    List<String> T = new List<string>();
    string line;
    while ((line = pattern.ReadLine()) != null)
        T.Add(line);
    pattern.Close();

    //finding matches and write them in output
    int counter = 0;
    while ((line = source.ReadLine()) != null)
    {
        foreach (string pat in T)
        {
            if (line.Contains(pat))
            {
                result.WriteLine("LineNo : " + counter.ToString() + " : " + line);
                break; //just if you want distinct output
            }
        }
        counter++;
    }

    source.Close();
    result.Close();
}

----------------------------EDIT---------------------------------- for the one you mentioned in comment

private void Comparer(string fileLocation1, string fileLocation2, string resultFolder)
{
    StreamReader source = new StreamReader(fileLocation1);
    StreamReader pattern = new StreamReader(fileLocation2);
    Directory.CreateDirectory(resultFolder);
    //reading patterns
    List<String> T = new List<string>();
    string line;
    while ((line = pattern.ReadLine()) != null)
        T.Add(line);
    pattern.Close();

    //finding matches and write them in output
    int counter;
    foreach (string pat in T)
    {
        StreamWriter result = File.CreateText(Path.Combine(resultFolder, pat + ".txt"));
        source.BaseStream.Position = counter = 0;
        while ((line = source.ReadLine()) != null)
        {
            if (line.Contains(pat))
                result.WriteLine("LineNo : " + counter.ToString() + " : " + line);
            counter++;
        }
        result.Close();
    }
    source.Close();
}


标签: c# asp.net