C# 阅读模式识别困难

C# 阅读模式识别困难,c#,file,C#,File,我有一个.txt文件,它是这样的: 5260|productCode1|data01|data02|data03|data04 5270|data05|data06|productCode1|data07 5270|data08|data09|productCode2|data10 5260|productCode2|data11|data12|data13|data14 5270|data15|data16|productCode1|data17 5270|data18|data19|prod

我有一个
.txt
文件,它是这样的:

5260|productCode1|data01|data02|data03|data04
5270|data05|data06|productCode1|data07
5270|data08|data09|productCode2|data10
5260|productCode2|data11|data12|data13|data14
5270|data15|data16|productCode1|data17
5270|data18|data19|productCode2|data20
我如何找到所有以5270开头并具有我想要的产品代码的行(比如productCode2,只返回第四行)


编辑:5260和5270只是线路启动器,它们不是ID。我正在使用的.txt文件没有类似于键值的内容

这将返回所有具有所需条件的行:

string productcode = "productCode1";
string id = "5270";

var result = System.IO.File.ReadAllLines(@"c:\file.txt")
                   .Select(x => x.Split('|'))
                   .Where(x => x.First() == id && x.Any(y => y == productcode));

我假设productCode可以位于任何位置

您好,您可以尝试以下操作

using System;
using System.IO;
using System.Text;

namespace ReadAllLines
{
    class Program
    {
        static void Main(string[] args)
        {
            var path = @"C:\Users\username\Documents\MyFile.txt";

            string[] lines = File.ReadAllLines(path, Encoding.UTF8);
            string yourProductCode;

            foreach (string line in lines)
            {
                if (line .Contains("5270|"))
                {
                  string[] myLine= line .Split('|');
                  if (myLine[3] == yourProductCode)
                  {
                   // myLine[] has all your data with the product code you want
                  }

                } 
            }
        }
    }
}
使用字典:

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


namespace ConsoleApplication147
{
    class Program
    {
        const string FILENAME = @"c:\temp\test1.txt";
        static void Main(string[] args)
        {
            StreamReader reader = new StreamReader(FILENAME);

            Dictionary<string, List<List<string>>> dict = new Dictionary<string, List<List<string>>>();

            string line = "";
            while((line = reader.ReadLine()) != null)
            {
                line = line.Trim();
                if (line.Length > 0)
                {
                    string[] splitData = line.Split(new char[] { '|' }).ToArray();
                    if (dict.ContainsKey(splitData[0]))
                    {
                        dict[splitData[0]].Add(splitData.Skip(1).ToList());
                    }
                    else
                    {
                        dict.Add(splitData[0], new List<List<string>>() {splitData.Skip(1).ToList()});
                    }
                }
            }

            foreach (List<String> code in dict["5270"])
            {
                Console.WriteLine("Product Code : {0}; Code : '{1}'; Data : '{2}'","5270", code[2], string.Join(",", code));
            }
            Console.ReadLine();
        }

    }

}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.IO;
命名空间控制台应用程序147
{
班级计划
{
常量字符串文件名=@“c:\temp\test1.txt”;
静态void Main(字符串[]参数)
{
StreamReader=新的StreamReader(文件名);
Dictionary dict=新字典();
字符串行=”;
而((line=reader.ReadLine())!=null)
{
line=line.Trim();
如果(直线长度>0)
{
string[]splitData=line.Split(新字符[]{'.'}).ToArray();
if(dict.ContainsKey(splitData[0]))
{
dict[splitData[0]].Add(splitData.Skip(1.ToList());
}
其他的
{
dict.Add(splitData[0],new List(){splitData.Skip(1.ToList()});
}
}
}
foreach(dict[“5270”]中的列表代码)
{
Console.WriteLine(“产品代码:{0};代码:'{1}';数据:'{2}'”,“5270”,代码[2],字符串.Join(“,”,代码));
}
Console.ReadLine();
}
}
}
“如何找到具有所需产品代码的5270?”

将返回符合标准的所有行

using System.IO;
using System.Linq;

public string[] ReadFile(string fileName)
{
    return File.ReadAllLines(fileName);
}

public string[] QueryFile(string fileName, string productCode, string lineStarter)
{
    var data = ReadFile(fileName);
    return data.Where(x => x.StartsWith(lineStarter) && x.Contains(productCode)).ToArray();
}
从这一点上,您可以根据预期的用例分割数据

用法:

QueryFile("Path_To_My_File.txt", "productCode2", "5270");
输出:

5270|data08|data09|productCode2|data10
5270|data18|data19|productCode2|data20
Oneliner:

public string[] QueryFile(string fileName, string productCode, string lineStarter)
{
    return File.ReadAllLines(fileName).Where(x => x.StartsWith(lineStarter) && x.Contains(productCode)).ToArray();
}

你能分享一下你到目前为止尝试了什么吗?你被困在哪里了?逐行筛选“startswith”5270,按“|”分割,productcode是索引3,筛选productcode你想要的…@Pedro澄清一下:你想要筛选(1.)以“5270”和(2)开头的行,然后在剩下的行中,你只想要那些“productcode”列与某个值匹配的行,对吗?你想要完整的匹配行,也对吗?问题编辑好了,希望我现在更清楚一点(顺便说一句,你明白了,这正是我需要的)。还有一个问题:“数据”字段可能等于产品代码吗?例如
“5270 | productCode2 | someDataValue | myActualProductCode | someOtherData”
?请注意,数据字段必须永远不等于productcodes才能正常工作。如果不了解更多有关数据结构的信息,我无法改进我的回答,我完全知道这一点。我只是想给你一个“提示”。@Fildor你是对的,我编辑了代码,现在数组中有你所有的数据和你唯一的productcodeAttention,“5270”是一个筛选标准,而不是productcode。Fildor是对的,而且你缺少一个条件。你错过了一个要点。“5270”不是期望的输出。OP知道,结果必须是“5270”,因为这是他想要筛选的。此外,他还想筛选产品代码。换句话说:结果应该是所有以“5270”开头的行的集合,并且具有所需的产品代码。或者更确切地说,我不是这样解释的。我想他的意思是,他有一个产品代码,他是如何找到产品代码的“id”的?@Fildor修正了你的观点(谢谢)!