我在一个文本文件中存储共享一个键的多个值。文本文件如下所示:
Brightness 36 , Manual
BacklightCompensation 3 , Manual
ColorEnable 0 , None
Contrast 16 , Manual
Gain 5 , Manual
Gamma 122 , Manual
Hue 0 , Manual
Saturation 100 , Manual
Sharpness 2 , Manual
WhiteBalance 5450 , Auto
现在,我想存储每个键的int值和字符串值(例如,亮度)。
C#的新手,找不到有效的工具。
谢谢
最佳答案
使用正则表达式和一点点的linq,您可以做很多事情。
在这里,我假设您知道How to read a Text file。
优点:如果文件不完美,则reg exp只会忽略格式错误的行,并且不会引发错误。
这是文件的硬编码版本,请注意,因此会出现\r
。取决于您读取文件的方式,但File.ReadLines()
情况并非如此
string input =
@"Brightness 36 , Manual
BacklightCompensation 3 , Manual
ColorEnable 0 , None
Contrast 16 , Manual
Gain 5 , Manual
Gamma 122 , Manual
Hue 0 , Manual
Saturation 100 , Manual
Sharpness 2 , Manual
WhiteBalance 5450 , Auto";
string regEx = @"(.*) (\d+) , (.*)";
var RegexMatch = Regex.Matches(input, regEx).Cast<Match>();
var outputlist = RegexMatch.Select(x => new { setting = x.Groups[1].Value
, value = x.Groups[2].Value
, mode = x.Groups[3].Value });
正则表达式说明:
/(.*) (\d+) , (.*)/g
第一捕获组(。*)
.*
匹配任何字符(行终止符除外)*
量词-匹配零次至无限次,并尽可能多地匹配,并根据需要返回(贪婪)
从字面上匹配字符
(区分大小写)第二捕获组(\ d +)
\d+
匹配一个数字(等于[0-9])+
量词-匹配一次和无限次,尽可能多地匹配,并根据需要返回(贪婪),
从字面上匹配字符,
(区分大小写)第三捕获组(。*)
.*
匹配任何字符(行终止符除外)*
量词-匹配零次至无限次,并尽可能多地匹配,并根据需要返回(贪婪)免责声明:
永远不要相信输入!即使是文件,其他程序也可以做到,也可以由客户发送。
根据我的经验,您有两种处理不良格式的方法:
逐行读取,并注册每条不良行。
或忽略它们。你不健康,你不坐!
而且不要告诉自己,这不会发生,它将发生!