Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ替换不同的字符串值_C#_Linq_.net 4.5 - Fatal编程技术网

C# LINQ替换不同的字符串值

C# LINQ替换不同的字符串值,c#,linq,.net-4.5,C#,Linq,.net 4.5,我通过解析带有一些地址的文本文件构造了一个变量 FileInfo fi = new FileInfo(@"C:\temp\Addresses.txt") var ZipCodesAndCountryCodes = File.ReadLines(fi.FullName) .Select(l => new { ZipCode = l.Substring(1395,

我通过解析带有一些地址的文本文件构造了一个变量

FileInfo fi = new FileInfo(@"C:\temp\Addresses.txt")
var ZipCodesAndCountryCodes = File.ReadLines(fi.FullName)
            .Select(l => new 
                         {
                           ZipCode = l.Substring(1395, 5),
                           CountryCode =  String.IsNullOrWhiteSpace(l.Substring(1405,30))
                                          ? "US"
                                          : l.Substring(1405,30)
                         });
在这段代码中,我用“US”替换国家的任何空白值。但是,如果国家是“美国”或“美利坚合众国”或“美国”,我也希望将其正常化为“美国”。在林克我怎么做?如果是其他国家,则应按原样包括在内

速度也是一个考虑因素,因为我将解析的文本文件大约为800MB。谢谢你的帮助

更新1: 当我尝试Mark和Aush的答案时,我得到了这个错误:

System.ObjectDisposedException: Cannot read from a closed TextReader.
at System.IO.__Error.ReaderClosed()
at System.IO.StreamReader.ReadLine()
at System.IO.File.<InternalReadLines>d__0.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Lookup`2.Create[TSource](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
at System.Linq.GroupedEnumerable`3.GetEnumerator()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at AnthemMDTS.Program.Main(String[] args) in  c:\Projects\CustomerA\CustomerATax\Program.cs:line 100
System.ObjectDisposedException:无法从关闭的文本读取器读取。
在System.IO.\u Error.ReaderClosed()处
在System.IO.StreamReader.ReadLine()中
在System.IO.File.d__0.MoveNext()中
在System.Linq.Enumerable.WhereSelectEnumerableInterator`2.MoveNext()中
在System.Linq.Lookup`2.Create[TSource](IEnumerable`1源、Func`2键选择器、Func`2元素选择器、IEqualityComparer`1比较器)
在System.Linq.GroupedEnumerable`3.GetEnumerator()中
在System.Linq.Enumerable.WhereSelectEnumerableInterator`2.MoveNext()中
在c:\Projects\CustomerA\CustomerATax\Program.cs中的AnthemMDTS.Program.Main(字符串[]args)处:第100行

这里讨论的文本阅读器是什么?我没有关闭任何东西,代码中也没有任何循环

您可以在查询表达式中使用
let
子句来存储国家名称的
Substring()
结果

FileInfo fi = new FileInfo(@"C:\temp\Addresses.txt")
var ZipCodesAndCountryCodes = File.ReadLines(fi.FullName).Select(l => 
{
    var countrySubstr = l.Substring(1405,30);
    return new 
    {
        ZipCode = l.Substring(1395, 5),
        CountryCode = string.IsNullOrWhiteSpace(countrySubstr)
                    || countrySubstr == "USA"
                    || countrySubstr == "United States"
                    || countrySubstr == "United States of America"
                        ? "US" : countrySubstr
    };
});
var ZipCodesAndCountryCodes = from line in File.ReadLines(fi.FullName)
                              let country = line.Substring(1405,30)
                              select new                            
                              {
                                  ZipCode = line.Substring(1395, 5),
                                  CountryCode = (   string.IsNullOrWhiteSpace(country)
                                                 || country=="United States"
                                                 || country=="United States of America"
                                                 || country=="USA")
                                                 ? "US"
                                                 : country
                              };

您可以在查询表达式中使用
let
子句来存储国家名称的
Substring()
结果

var ZipCodesAndCountryCodes = from line in File.ReadLines(fi.FullName)
                              let country = line.Substring(1405,30)
                              select new                            
                              {
                                  ZipCode = line.Substring(1395, 5),
                                  CountryCode = (   string.IsNullOrWhiteSpace(country)
                                                 || country=="United States"
                                                 || country=="United States of America"
                                                 || country=="USA")
                                                 ? "US"
                                                 : country
                              };
我可能会使用
左外连接
预定义映射的值

Dictionary<string, string> mappings = new Dictionary<string, string>()
{
    { "United States", "US" },
    { "United States of America", "US" },
    { "USA", "US" }
};

return ZipCodesAndCountryCodes
           .GroupJoin(mappings,
                      a => a.CountryCode,
                      b => b.Key,
                      (a, b) => new { 
                                        a.ZipCode,
                                        CountryCode = b.Select(x => x.Value).FirstOrDefault() ?? a.CountryCode
                                    },
                      StringComparer.CurrentCultureIgnoreCase);
字典映射=新字典()
{
{“美国”,“美国”},
{“美利坚合众国”、“美国”},
{“美国”、“美国”}
};
返回ZipCodes和CountryCodes
.GroupJoin(映射,
a=>a.CountryCode,
b=>b.键,
(a,b)=>新{
a、 ZipCode,
CountryCode=b.选择(x=>x.Value).FirstOrDefault()??a.CountryCode
},
StringComparer.CurrentCultureInogoreCase);
这允许您轻松地添加映射,如果不存在映射,它将默认为当前映射

这种方法的主要优点是能够修改映射,而无需对代码进行大量更改,也无需维护其中的任何逻辑(确保逻辑or周围有正确的括号等)

如果你的字面意思是,这些是你唯一会遇到的,那么使用另一种方法可能是最容易的。作为一个以前处理过类似类型文件的人,我希望有其他值可以很快正常化。

我可能会使用
左外连接
预定义映射的值

Dictionary<string, string> mappings = new Dictionary<string, string>()
{
    { "United States", "US" },
    { "United States of America", "US" },
    { "USA", "US" }
};

return ZipCodesAndCountryCodes
           .GroupJoin(mappings,
                      a => a.CountryCode,
                      b => b.Key,
                      (a, b) => new { 
                                        a.ZipCode,
                                        CountryCode = b.Select(x => x.Value).FirstOrDefault() ?? a.CountryCode
                                    },
                      StringComparer.CurrentCultureIgnoreCase);
字典映射=新字典()
{
{“美国”,“美国”},
{“美利坚合众国”、“美国”},
{“美国”、“美国”}
};
返回ZipCodes和CountryCodes
.GroupJoin(映射,
a=>a.CountryCode,
b=>b.键,
(a,b)=>新{
a、 ZipCode,
CountryCode=b.选择(x=>x.Value).FirstOrDefault()??a.CountryCode
},
StringComparer.CurrentCultureInogoreCase);
这允许您轻松地添加映射,如果不存在映射,它将默认为当前映射

这种方法的主要优点是能够修改映射,而无需对代码进行大量更改,也无需维护其中的任何逻辑(确保逻辑or周围有正确的括号等)


如果你的字面意思是,这些是你唯一会遇到的,那么使用另一种方法可能是最容易的。作为一个以前处理过类似类型文件的人,我希望有其他值可以很快正常化。

您必须使用LINQ吗?对于这么大的文件,您应该使用filereader解析数据,然后将其插入到构造函数中。使用LINQ主要是因为需要进行一些分组和聚合,而且还因为不涉及数据库。您必须使用LINQ吗?对于这么大的文件,您应该使用filereader解析数据,然后将其插入到构造函数中。使用Q主要是因为需要进行一些分组和聚合,而且还因为不涉及数据库;getting
System.ObjectDisposedException:无法从关闭的文本读取器中读取。
在此行。知道为什么吗?
File.ReadLines()
返回的枚举数使用了一个
TextReader
,调用
GroupBy()
操作符似乎可以关闭它。您可以使用File.ReadAllLines()来代替,首先将其全部转储到数组中。使用ReadAllLines()时,我会在以下情况下退出内存异常。;文本文件非常大(~800MB-1.2GB)。但是,它在测试机器中工作,使用示例文件。您必须编写自己的逐行流读取器,它接受lambda表达式,您可以将其用于LINQ查询;getting
System.ObjectDisposedException:无法从关闭的文本读取器中读取。
在此行。知道为什么吗?
File.ReadLines()
返回的枚举数使用了一个
TextReader
,调用
GroupBy()
操作符似乎可以关闭它。您可以使用File.ReadAllLines()来代替,首先将其全部转储到数组中。使用ReadAllLines()时,我会在以下情况下退出内存异常。;文本文件非常大(~800MB-1.2GB)。不过,它在测试机器上运行,使用的是示例文件。您必须逐行编写自己的代码