【问题标题】:C# read file parse into array [closed]C#读取文件解析成数组[关闭]
【发布时间】:2014-02-05 10:47:41
【问题描述】:

我正在尝试将输入文件读入数组。我的文件看起来像:

00000*5071177*M010165767HAZZ JONES FAKE B M12/16/196901/06/2014000000036209 00000*5071178*M0201657677315 FAKE ST MOON TX56464 485942934 维护

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

所以我的数组将包含类似 [5071177] -> array([Jones, Fake,B, M12/16/196901,Fake ST, Moon,etc]); 实现这一目标的最佳方法是什么?

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); /
}

【问题讨论】:

  • 在空间上分割,你的逻辑呢? ...问题是什么?
  • 问题不清楚。

标签: c# arrays object


【解决方案1】:

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

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();

【讨论】:

  • 感谢,我刚开始使用 C#,对语法一无所知
  • 不客气。您可能需要执行一些额外的逻辑,因为您的示例字符串似乎没有完全用空格分隔。
  • 因为我从 main 运行 streamreader 和 writer 我如何调用 public Record Parse(string raw) 如果它在另一个类中只是一个简单的函数调用,如 parse(line)
  • 我已将类的用法添加到我的答案中。
  • 最后一行 return file.Readlines(path) 给了我一个错误,无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“string[]”。存在显式转换(您是否缺少演员表?)
【解决方案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);
}));

【讨论】:

  • 我在var id = arr[0].split('*')[1]; 行得到 (System.IndexOutOfRangeException) 你能解释一下这段代码吗
  • 它得到"B" 是字符串"A*B*C"。在您的问题中,您暗示 B 是您的身份。
  • @iomed 哦,我看到文件中没有实际的 * 我只是添加它以强调该行的那一部分。我可以在 substring(7,15) 上做一些拆分吗?
  • @Edward,请使用干净(真实)的输入样本更新您的问题。
  • @Edward,是的,你可以写arr[0].Substring(7, 7) 代替arr[0].Split('*')[1];
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
相关资源
最近更新 更多