要求:用户从外部导入TXT文件(input textfile),该文件有三列,分别是storeNum,MosrName,MosrNum,如下是一个input textfile的Case:
5099,Scoresby,5659
5250,Scoresby,5659
5211,Scoresby,5659
5131,Scoresby,5659
5099,Scoresby,5659
5250,Scoresby,5659
5250,Scoresby,5659
5131,Scoresby,5659
5099,Scoresby,5659
5130,Scoresby,5659
5131,Scoresby,5659
5211,Scoresby,5659
5250,Scoresby,5659
为了程序后续处理该文件,需要验证如下两点:
1)input textfile中可以出现空行,如有空行要忽略它。
2)向用户报告哪些行的storeNum是重复的,报告的格式如下:
Line #1,5,10, has replicated storeNum value : x.
Line #2,3, has replicated storeNum value : y.
第一个问题的简单的处理思路是:读取到一行后过滤空白符,再判断改行的长度是否为零。
第二个问题的有两个思路:
方法1:将各行读到HashSet中,由于HashSet是集合其本身不会被排序,所以可将HashSet排序(HashSet.OrderBy(Comparer))的副本保存到List中再做后序处理。
方法2:由于HashSet本身不会被排序(但是副本可以被排序),所以直接考虑用List。
这两个方法都会将原始的Input textfile中的行被排序,最后提示错误信息将和原始Input textfile不一致,解决这个问题的一个处理办法是:
将原始的Input textfile加上行号,这样即使被排序后,仍然可以知道这行在原始的Input textfile是第几行。
完整的实现如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.IO; 6 7 namespace ValidReplicatedLineVer3 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 string filePath = @"E:\inputfile.txt"; 14 StreamReader sr = new StreamReader(filePath); 15 16 List<Line> list = new List<Line>(); 17 int num = 1; 18 19 20 while (!sr.EndOfStream) 21 { 22 string strTemp = sr.ReadLine(); 23 if (strTemp.Trim().Length == 0) 24 { 25 continue; 26 } 27 28 string[] strArr = strTemp.Split(new char[] { ‘,‘ }); 29 Line line = new Line(); 30 line.lineNum = num++; 31 line.storeNum = strArr[0]; 32 line.mosrName = strArr[1]; 33 line.mosrNum = strArr[2]; 34 35 list.Add(line); 36 } 37 sr.Close(); 38 39 list = list.OrderBy(x => x.storeNum).ToList(); 40 41 foreach (Line l in list) 42 { 43 StringBuilder sb1 = new StringBuilder(); 44 sb1.AppendLine(Convert.ToString(l.lineNum) + ‘,‘ + l.storeNum + ‘,‘ + l.mosrName + ‘,‘ + l.mosrNum); 45 Console.Write(sb1); 46 } 47 48 StringBuilder sb = new StringBuilder(); 49 sb = ValidReplicatedLines(list); 50 Console.WriteLine(sb); 51 52 } 53 54 static StringBuilder ValidReplicatedLines(List<Line> list ) 55 { 56 bool isFirst = true; 57 string storeNum = null; 58 StringBuilder sb = new StringBuilder(); 59 StringBuilder sbRet = new StringBuilder(); 60 for (int i = 0; i < list.Count - 1; i++) 61 { 62 if ((list[i].storeNum == list[i + 1].storeNum) && ((i + 1) != list.Count)) 63 { 64 if (isFirst) 65 { 66 sb.Append("Line #" + Convert.ToString(list[i].lineNum) + "," + Convert.ToString(list[i + 1].lineNum) + ","); 67 isFirst = false; 68 storeNum = list[i].storeNum; 69 } 70 else 71 { 72 sb.Append(Convert.ToString(list[i + 1].lineNum) + ‘,‘); 73 } 74 } 75 else 76 { 77 if (sb.ToString().Trim().Length != 0) 78 { 79 sb.Append(" replicated value: " + storeNum); 80 isFirst = true; 81 sbRet.AppendLine(sb.ToString()); 82 sb.Remove(0, sb.Length); 83 } 84 } 85 } 86 if (sb.ToString().Trim().Length != 0) 87 { 88 sb.Append("replicated value: " + storeNum); 89 sbRet.AppendLine(sb.ToString()); 90 } 91 92 return sbRet; 93 } 94 95 public class Line 96 { 97 public int lineNum; 98 public string storeNum; 99 public string mosrName; 100 public string mosrNum; 101 } 102 } 103 }
HashSet/List 排序