2017-06-22 55 views
-1

---- ---- 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 

我上面有兩個txt文件「」和‘|’分離,我想在C# 創建控制檯應用程序,當我從命令提示符傳遞起始位置和目標位置時讀取兩個文件。 也同時搜索,我想忽略重複行也希望通過價格,以顯示結果

輸出會像{首創} - > {目的地} - >日期時間 - >價格

需要幫助如何執行。

+5

你有到目前爲止你的代碼示例嗎? – Gareth

+1

你知道如何閱讀文本文件嗎?另外,如果你正在創建一個控制檯應用程序,爲什麼你用'asp.net'標記它? –

+3

瞭解如何逐行讀取文件。 瞭解如何按給定的分隔符分割字符串:','或'|'等等。 瞭解如何比較字符串。 瞭解如何使用字符串插值連接字符串和變量,使用$美元符號和變量的括號。 逐行讀取兩個文件。拆分並比較字符串(如果它們不匹配)將兩個或兩個字符串中的一個附加到一個集合,具體取決於它們是否匹配,或者是否使用字符串插值構建所需的新字符串。 如果你已經知道,然後向我們展示一些代碼示例,所以我們可以幫助你改進它們 –

回答

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); 
       } 
      } 
    } 
} 
+0

感謝讓我試試更多的問題在命令提示符用戶將添加'$搜索-o YYZ -d YYC'並基於此我需要驗證整個過程,並需要顯示結果如何處理這個?也在我的txt文件中,我有靜態頭以上的數據如何跳過解析該頭文件?在此先感謝 – cshah

+0

我有一件事如何跳過 - reader.ReadLine()。Skip(1);但其他命令promt這仍然懸而未決 – cshah

0

我不是100%清楚你的程序的輸出應該是什麼,所以我會把這部分的實現留給你。我的策略是使用一個構造函數方法,它接受一個字符串(您將從文件中讀取)和一個分隔符(因爲它會變化),並使用它來創建可以操作的對象(例如,添加到散列集等)。

PriceObject.cs

using System; 
using System.Globalization; 

namespace ConsoleApplication1 
{ 
class PriceObject 
{ 
    public string origination { get; set; } 
    public string destination { get; set; } 
    public DateTime time { get; set; } 
    public decimal price { get; set; } 



    public PriceObject(string inputLine, char delimiter) 
    { 
     string[] parsed = inputLine.Split(new char[] { delimiter }, 4); 
     origination = parsed[0]; 
     destination = parsed[1]; 
     time = DateTime.ParseExact(parsed[2], "yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture); 
     price = Decimal.Parse(parsed[3], NumberStyles.Currency, new CultureInfo("en-US")); 
    } 


    public override bool Equals(object obj) 
    { 
     var item = obj as PriceObject; 
     return origination.Equals(item.origination) && 
      destination.Equals(item.destination) && 
      time.Equals(item.time) && 
      price.Equals(item.price); 
    } 

    public override int GetHashCode() 
    { 

     unchecked 
     { 
      var result = 17; 
      result = (result * 23) + origination.GetHashCode(); 
      result = (result * 23) + destination.GetHashCode(); 
      result = (result * 23) + time.GetHashCode(); 
      result = (result * 23) + price.GetHashCode(); 
      return result; 
     } 
    } 


} 
} 

Program.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(); 
    } 
} 
} 
+0

只是一個說明,因爲根據您的意見您在加載文件時遇到了問題:我使用命令行參數運行了上述程序:C:\ temp \ test1.txt C:\ temp \ test2.txt –

+0

感謝讓我嘗試在命令提示符下添加一個問題用戶將添加' $搜索-o YYZ -d YYC'並基於此我需要驗證整個過程,並需要顯示結果如何處理這個?也在我的txt文件中,我有靜態頭以上的數據如何跳過解析該頭文件?在此先感謝 – cshah

+0

不確定「驗證整個過程」的意思,但如果您嘗試查找與例如起源「YYZ」,目的地「YTC」,您可以將這些參數作爲變量放入linq查詢中。例如。 'PriceObject outputObject = output.Where(x => x.origination.Equals(「YYZ」)&& x.destination.Equals(「YTC」))。FirstOrDefault();'。爲了跳過標題,我在開始時執行了這個操作:在while循環之前的'reader.ReadLine()'將剝離標題。我會編輯一個評論,使之更清晰。 –