Подсчет повторяющихся строк из текстовых файлов с использованием C # - PullRequest
0 голосов
/ 08 декабря 2018

Эй, ребята, я работаю над программой, которая берет информацию из текстового файла и выводит информацию в CSV-файл. Единственное, что мне нужно сделать, это дополнить подсчет дубликатов файлов (где это возможно, дубликаты записейобвинение в совершении преступления против отдельного лица должно быть объединено в одну запись с дополнительным полем, называемым «количество», которое указывает количество найденных повторяющихся записей (для неповторяющихся записей это поле должно быть установлено равным нулю).).У меня были небольшие проблемы с добавлением счетчика, и мне было интересно, есть ли у вас, ребята, какой-нибудь совет для меня.

Спасибо

using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Text;

namespace finalproj
{
    class Program
    {
        static void Main(string[] args)
        {
            StreamReader reader = new StreamReader("DISTRICT.DISTRICT_COURT_.11.13.18.AM.000B.CAL.txt");

            StreamWriter writer = new StreamWriter("outtext.csv");

            int counts;
            string line = "";

            for (int x = 0; x < 1; x++)
            {
                string buffer = reader.ReadLine();
                line += " " + buffer;
            }

            //StreamWriter writer = new StreamWriter("outtext.csv");
            //writer.WriteLine(line);
            //writer.Close();

            //Console.WriteLine(line);

            while (line != null)
            {
                if (line.Contains("APT."))
                {
                    Console.WriteLine(line);
                }
                else if (line.Contains("BPD"))
                {
                    Console.WriteLine(line);
                }
                else if (line.Contains("18IF"))
                {
                    Console.WriteLine(line);
                }
                else if (line.Contains("SHP"))
                {
                    Console.WriteLine(line);
                }
                else if (line.Contains("SFF"))
                {
                    Console.WriteLine(line);
                }
                else if (line.Contains("CLS:"))
                {
                    Console.WriteLine(line);
                }
                else if (line.Contains("BOND"))
                {
                    Console.WriteLine(line);
                }
                else if (line.Contains("ATTY"))
                {
                    Console.WriteLine(line);
                }
                else if (line.Contains("(T)"))
                {
                    Console.WriteLine(line);
                }
                else if (line.Contains("(M)"))
                {
                    Console.WriteLine(line);
                }
                else if (line.Contains("(F)"))
                {
                    Console.WriteLine(line);
                }
                else if (line.Contains("(I)"))
                {
                    Console.WriteLine(line);
                }


                line = reader.ReadLine();
                writer.WriteLine(line);
            }


            writer.WriteLine(line);

            reader.Close();
            writer.Close();
            Console.WriteLine(line);


            //using (reader)
            //{
            //    
            //string line1;
            //string[] split = new
            //    while((line1 = reader.ReadLine()) !=null)
            //    {
            //        string[] split = 
            //    }
            //}

            Console.ReadKey();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Итак, я использовал Regex, чтобы соответствовать тому, что вы ищете, и использовал SordedSet, чтобы захватить строки и посмотреть, есть ли дубликаты.Имейте в виду, что с большими файлами вы можете использовать довольно много памяти, но поскольку это связано с CSV, я думаю, у вас все в порядке:

using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;

namespace ConsoleApp4
{
    class Program
    {

        static void Main(string[] args)
        {
            StreamReader reader = new StreamReader("DISTRICT.DISTRICT_COURT_.11.13.18.AM.000B.CAL.txt");

            StreamWriter writer = new StreamWriter("outtext.csv");

            int counts = 0;
            string line ;

            SortedSet<string> uniqueLine = new SortedSet<string>();

            Regex findWords = new Regex(@"(APT.|BPD|18IF|SHP|SFF|CLS:|BOND|ATTY|\(T\)|\(M\)|\(F\)|\(I\))");

            while ((line = reader.ReadLine()) != null)
            {
                if (uniqueLine.Contains(line))
                {
                    counts++;
                }
                else
                {
                    uniqueLine.Add(line);
                    writer.WriteLine(line);
                }
                Match aMatch = findWords.Match(line);

                if (aMatch.Success)
                {
                    Console.WriteLine(line);
                }

            }

            writer.WriteLine("Count:{0}", counts);
            writer.Close();


            Console.ReadKey();
        }
    }
}
0 голосов
/ 08 декабря 2018

Для разделения строк и подсчета вхождений вы можете разделить с помощью NewLine и использовать Linq

string[] lines = str.Split(new[] { Environment.NewLine },StringSplitOptions.None);
var result = lines.GroupBy(g => g)
            .Select(s => new { Key = s.Key, Count = s.Count()})
            .ToDictionary(d => d.Key, d => d.Count);

В результате будут строки, которые имеют одно вхождение.Если вам нужны только повторяющиеся строки

var result = lines.GroupBy(g => g).Where(x=> x.Count()>1)
            .Select(s => new { Key = s.Key, Count = s.Count()})
            .ToDictionary(d => d.Key, d => d.Count);

Вы можете написать CSV прямо из словаря

File.WriteAllLines(filePath, result.Select(x=>$"{x.Key},{x.Value},"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...