2014-02-05 131 views
-2

我试图读取输入文件到数组中。我的文件看起来像:C#读取文件解析到数组

00000 * * M010165767HAZZ JONES FAKE乙M12 /十九万六千九百零一分之十六/ 06/2014000000036209 00000 * * M0201657677315 FAKE ST MOON TX56464 485942934维持性

当第一行的第一个单词中的模式与第二行的第二个模块中的模式相匹配时,我希望将整个被空格分隔的行压入数组或对象中。

因此我的数组将包含类似于 [5071177] - > array([Jones,Fake,B,M12/16/196901,Fake ST,Moon等]); 完成此操作的最佳方法是什么?

StreamReader sR = new StreamReader("Desktop/records2.txt"); 
StreamWriter sW = new StreamWriter("Desktop/new.txt"); 

while (sR.Peek() != -1) // stops when it reachs the end of the file 
{ 
    string line = sR.ReadLine(); 
    // var myArray = line.Split('\n'); 
    string[] myarray = line.Split(' '); 
    // "line" EDITING GOES HERE 
    sW.WriteLine(myarray);/
} 
+0

分上的空间,做你的逻辑是什么? ... 问题是什么? – Noctis

+1

问题不明确。 – Carra

回答

6

首先创建一个类来保存您的数据:

public Record 
{ 
    public string Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string DateOfBirth { get; set; } 
    /* etc */ 
} 

创建一个名为像Parse()返回一个Record另一个类的方法。

public class RecordParser 
{ 
    private List<string> rawRecords; 

    public RecordParser() 
    { 
     rawRecords = new List<string>(); 
    } 

    public RecordParser(string filePath) 
    { 
     rawRecords = new List<string>(); 
     rawRecords.AddRange(ReadLines(filePath)); 
    } 

    public Record Parse(string raw) 
    { 
     // 00000*5071177*M010165767HAZZ JONES FAKE B M12/16/196901/06/2014000000036209 
     string[] myarray = line.Split(' '); 
     Record record = new Record 
     { 
      Id = myarray[0].Split('*')[1], 
      FirstName = myarray[1], 
      LastName = myarray[2], 
      DateOfBirth = myarray[3], 
      /* etc */ 
     }; 
     return record; 
    } 

    public List<Record> ParseAll() 
    { 
     if(!rawRecords.Any()) throw new ArgumentNullException("Nothing to parse."); 

     var records = new List<Record>(); 
     foreach(string raw in rawRecords) 
     { 
      records.Add(Parse(raw)); 
     } 
     return records; 
    } 

    private List<string> ReadLines(string path) 
    { 
     // exception handling needed. 
     return File.ReadLines(path).ToList(); 
    } 
} 

用法:

var recordParser = new RecordParser(); 
string data = "00000*5071177*M010165767HAZZ JONES FAKE B M12/16/196901/06/2014000000036209"; 
Record record = recordParser.Parse(data); 

var recordParser = new RecordParser(@"C://data.txt"); 
List<Record> records = recordParser.ParseAll(); 
+0

感谢你们,我刚刚开始使用C#并且对语法一无所知 – Edward

+0

不客气。你可能需要做一些额外的逻辑,因为你的示例字符串似乎并没有被空格完全分开。 –

+0

因为即时通讯运行从主流streamreader和作家我如何调用公共记录解析(字符串原始)如果它在另一个类只是一个简单的函数调用像'parse(line)'? – Edward

2
File.WriteAllLines(newFile, File.ReadAllLines(oldFile).Select((x) => 
{ 
    var arr = x.Split(' '); 
    var id = arr[0].Split('*')[1]; 
    var spearatedData = string.Join(", ", arr.Skip(0).ToArray()) 
    return string.Format("[{0}] => ({1})", id, spearatedData); 
})); 
+0

即时获取(System.IndexOutOfRangeException)\t关于'var id = arr [0] .split('*')[1];'line你能解释一下这个代码多一点 – Edward

+1

它得到''B“'是字符串' “A * B * C”'。在你的问题中,你暗示'B'是你的Id。 –

+0

@iomed哦,我看到这里没有实际的*文件,我只是增加它来强调该部分的行。我可以做一些像分割字符串(7,15)吗? – Edward