比较C#中的文本文件并删除重复的行

时间:2017-06-22 14:10:13

标签: c# c#-4.0 console system.io.file

的1.txt

起源,目的地,日期时间,价格

YYZ,YTC,2016-04-01 12:30,$550
YYZ,YTC,2016-04-01 12:30,$550
LKC,LKP,2016-04-01 12:30,$550

2.txt

起源|目的地|日期时间|价

YYZ|YTC|2016-04-01 12:30|$550
AMV|YRk|2016-06-01 12:30|$630
LKC|LKP|2016-12-01 12:30|$990

我有两个文本文件','和' |'作为分隔符,我想在C#中创建一个控制台应用程序,当我从命令提示符传递一个起始位置和目标位置时,它会读取这两个文件。

在搜索时,我想忽略重复的行,我想按价格按顺序显示结果。

输出应为{ origination } -> { destination } -> datetime -> price

需要帮助如何执行。

2 个答案:

答案 0 :(得分:0)

我并不是100%清楚你的程序输出应该是什么,所以我将把实现的那部分留给你。我的策略是使用一个构造函数方法,它接受一个字符串(你将从文件中读取)和一个分隔符(因为它变化)并使用它来创建你可以操作的对象(例如添加到哈希集等)。 / p>

<强> PriceObject.cs

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

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        HashSet<PriceObject> list1 = new HashSet<PriceObject>();
        HashSet<PriceObject> list2 = new HashSet<PriceObject>();

        using (StreamReader reader = File.OpenText(args[0]))
        {
            string line = reader.ReadLine(); // this will remove the header row

            while (!reader.EndOfStream)
            {
                line = reader.ReadLine();
                if (String.IsNullOrEmpty(line))
                    continue;
                // add each line to our list
                list1.Add(new PriceObject(line, ','));
            }

        }

        using (StreamReader reader = File.OpenText(args[1]))
        {
            string line = reader.ReadLine(); // this will remove the header row

            while (!reader.EndOfStream)
            {
                line = reader.ReadLine();
                if (String.IsNullOrEmpty(line))
                    continue;
                // add each line to our list
                list2.Add(new PriceObject(line, '|'));
            }

        }

        // merge the two hash sets, order by price
        list1.UnionWith(list2);
        List<PriceObject> output = list1.ToList();

        output.OrderByDescending(x => x.price).ToList();

        // display output here, e.g. define your own ToString method, etc
        foreach (var item in output)
        {
            Console.WriteLine(item.ToString());
        }

        Console.ReadLine();
    }
}
}

<强> Program.cs的

{{1}}

答案 1 :(得分:0)

这是一个适用于您的示例文件的简单解决方案。如果文件格式不正确,则没有任何错误检查。

using System;
using System.Collections.Generic;

class Program
{
    class entry
    {
        public string origin;
        public string destination;
        public DateTime time;
        public double price;
    }

    static void Main(string[] args)
    {
        List<entry> data = new List<entry>();

        //parse the input files and add the data to a list
        ParseFile(data, args[0], ',');
        ParseFile(data, args[1], '|');

        //sort the list (by price first)
        data.Sort((a, b) =>
        {
            if (a.price != b.price)
                return a.price > b.price ? 1 : -1;
            else if (a.origin != b.origin)
                return string.Compare(a.origin, b.origin);
            else if (a.destination != b.destination)
                return string.Compare(a.destination, b.destination);
            else
                return DateTime.Compare(a.time, b.time);
        });

        //remove duplicates (list must be sorted for this to work)
        int i = 1;
        while (i < data.Count)
        {
            if (data[i].origin == data[i - 1].origin
                && data[i].destination == data[i - 1].destination
                && data[i].time == data[i - 1].time
                && data[i].price == data[i - 1].price)
                data.RemoveAt(i);
            else
                i++;
        }

        //print the results
        for (i = 0; i < data.Count; i++)
            Console.WriteLine("{0}->{1}->{2:yyyy-MM-dd HH:mm}->${3}",
                data[i].origin, data[i].destination, data[i].time, data[i].price);

        Console.ReadLine();
    }

    private static void ParseFile(List<entry> data, string filename, char separator)
    {
        using (System.IO.FileStream fs = System.IO.File.Open(filename, System.IO.FileMode.Open))
        using (System.IO.StreamReader reader = new System.IO.StreamReader(fs))
            while (!reader.EndOfStream)
            {
                string[] line = reader.ReadLine().Split(separator);
                if (line.Length == 4)
                {
                    entry newitem = new entry();
                    newitem.origin = line[0];
                    newitem.destination = line[1];
                    newitem.time = DateTime.Parse(line[2]);
                    newitem.price = double.Parse(line[3].Substring(line[3].IndexOf('$') + 1));
                    data.Add(newitem);
                }
            }
    }
}