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修正了你的观点(谢谢)!