C# 在尝试读取子字符串之前检测文件中的行是否存在
C# detect if line in file exists, before attempting to read substring
我想从文本文件中读取设置。
string MySettingsFile = "Settings.txt";
通常情况下,文件会有 4 行。
SettingA:Alpha1
SettingB:Bravo2
SettingC:Charlie1
SettingD:Delta6
我想在它自己的变量中获取每一行,像这样:
string MyAlpa = "Alpha1";
string MyBravo = "Bravo2";
string MyCharlie = "Charlie1";
string MyDelta = "Delta6";
通常情况下,我会循环读取行,读取每一行并边读边设置字符串。
但是,如果缺少第 4 行,而我正在寻找冒号后的那部分行,那么如果我这样检查它,我会得到一个错误...
MyDelta = MyDeltaSubstring(MyDelta.LastIndexOf(':') + 1);
有没有办法在我尝试获取 SubString 之前 'check for the existence of a specific line'(这样它就不会出错),比如
一个单独的函数,它有 try、catch、finally with return 我想要的字符串或单词 "Missing",如果该行丢失(然后停止,因为没有更多的行)?
function DoesLineExist(int X, string myFile)
{
string MyString;
try ()
{
// read line X from file myFile
// get everything AFTER the ":" and put it in MyString
// ??? //
}
catch (ArgumentException null)
{
MyString = "Missing";
}
catch (ArgumentException e)
{
MyString = "Missing";
}
finally
{
MyString = ? // whatever we got From Line X (after ":")
}
return MyString; // only if line is missing
}
有更好的方法吗?
ReadAllLines 或其他东西?
这里有几种不同的方法来构建我们稍后将使用的字典或列表对象。选择很简单,是那些键是唯一的,还是您对某些 SettingB
有多个值。如果关系是一对一的 Dictionary could be a solution. Giving you access to method like ContainsKey
var regexDictionary = Regex.Matches( File.ReadAllText(path)
, "(?<key>.+):(?<value>.+)")
.OfType<Match>()
.Where(m => m.Success)
.ToDictionary(m => m.Groups["key"].Value.Trim(),
m => m.Groups["value"].Value.Trim());
var ObjList = File.ReadAllLines(path)
.Select(line => line.Split(':'))
.Select(x => new MyObject {
prop1 = x[0],
prop2 = x[1]
// etc
})
var linQDictionary = File.ReadAllLines(path)
.Select(line => line.Split(':'))
.ToDictionary(
c => x[0],
c => x[1]
);
字典中是否存在该键?
if (!dictionary .ContainsKey("SettingB"))
{
Console.WriteLine("For key = \"SettingB\", value = {0}.", dictionary["SettingB"]);
}
在对象列表中:
if (ObjList .Any(x=> x.prop1 == "SettingZ" ))
{
// Select the object.
}
您需要首先验证该行是否存在,然后再次检查该行是否包含 key/value 对设置是否存在,然后将您的键值对投影到字典中,然后将每个设置获取到你的变量的键名。
这里我创建了一个控制台应用程序供您演示。
class Program
{
static void Main(string[] args)
{
Dictionary<string, string> dictSettings = new Dictionary<string, string>();
string MyAlpa = "";
string MyBravo = "";
string MyCharlie = "";
string MyDelta = "";
var lines = File.ReadAllLines(@"C:\Users\xxx\source\repos\ConsoleApp4\ConsoleApp4\Files\Sample.txt");
for (var i = 0; i < lines.Length; i += 1)
{
var line = lines[i];
//DoesLineExist(line);
if (!string.IsNullOrEmpty(line) && line.Contains(":"))
{
string settingKey = line.Split(':')[0];
string settingValue = line.Split(':')[1];
dictSettings.Add(settingKey, settingValue);
}
}
MyAlpa = dictSettings.ContainsKey("SettingA") ? dictSettings["SettingA"] : "";
MyBravo = dictSettings.ContainsKey("SettingB") ? dictSettings["SettingB"] : "";
MyCharlie = dictSettings.ContainsKey("SettingC") ? dictSettings["SettingC"] : "";
MyDelta = dictSettings.ContainsKey("SettingD") ? dictSettings["SettingD"] : "";
Console.WriteLine(MyAlpa);
Console.WriteLine(MyBravo);
Console.WriteLine(MyCharlie);
Console.WriteLine(MyDelta);
Console.ReadLine();
}
//private static void DoesLineExist(string line)
//{
// if (!string.IsNullOrEmpty(line) && line.Contains(":"))
// {
// string settingKey = line.Split(':')[0];
// string settingValue = line.Split(':')[1];
// dictSettings.Add(settingKey, settingValue);
// }
//}
}
输入:
SettingA:Alpha1
SettingB:Bravo2
SettingC:Charlie1
输出:
输入:
SettingA:Alpha1
SettingC:Charlie1
SettingD:
输出:
我想从文本文件中读取设置。
string MySettingsFile = "Settings.txt";
通常情况下,文件会有 4 行。
SettingA:Alpha1
SettingB:Bravo2
SettingC:Charlie1
SettingD:Delta6
我想在它自己的变量中获取每一行,像这样:
string MyAlpa = "Alpha1";
string MyBravo = "Bravo2";
string MyCharlie = "Charlie1";
string MyDelta = "Delta6";
通常情况下,我会循环读取行,读取每一行并边读边设置字符串。 但是,如果缺少第 4 行,而我正在寻找冒号后的那部分行,那么如果我这样检查它,我会得到一个错误...
MyDelta = MyDeltaSubstring(MyDelta.LastIndexOf(':') + 1);
有没有办法在我尝试获取 SubString 之前 'check for the existence of a specific line'(这样它就不会出错),比如 一个单独的函数,它有 try、catch、finally with return 我想要的字符串或单词 "Missing",如果该行丢失(然后停止,因为没有更多的行)?
function DoesLineExist(int X, string myFile)
{
string MyString;
try ()
{
// read line X from file myFile
// get everything AFTER the ":" and put it in MyString
// ??? //
}
catch (ArgumentException null)
{
MyString = "Missing";
}
catch (ArgumentException e)
{
MyString = "Missing";
}
finally
{
MyString = ? // whatever we got From Line X (after ":")
}
return MyString; // only if line is missing
}
有更好的方法吗? ReadAllLines 或其他东西?
这里有几种不同的方法来构建我们稍后将使用的字典或列表对象。选择很简单,是那些键是唯一的,还是您对某些 SettingB
有多个值。如果关系是一对一的 Dictionary could be a solution. Giving you access to method like ContainsKey
var regexDictionary = Regex.Matches( File.ReadAllText(path)
, "(?<key>.+):(?<value>.+)")
.OfType<Match>()
.Where(m => m.Success)
.ToDictionary(m => m.Groups["key"].Value.Trim(),
m => m.Groups["value"].Value.Trim());
var ObjList = File.ReadAllLines(path)
.Select(line => line.Split(':'))
.Select(x => new MyObject {
prop1 = x[0],
prop2 = x[1]
// etc
})
var linQDictionary = File.ReadAllLines(path)
.Select(line => line.Split(':'))
.ToDictionary(
c => x[0],
c => x[1]
);
字典中是否存在该键?
if (!dictionary .ContainsKey("SettingB"))
{
Console.WriteLine("For key = \"SettingB\", value = {0}.", dictionary["SettingB"]);
}
在对象列表中:
if (ObjList .Any(x=> x.prop1 == "SettingZ" ))
{
// Select the object.
}
您需要首先验证该行是否存在,然后再次检查该行是否包含 key/value 对设置是否存在,然后将您的键值对投影到字典中,然后将每个设置获取到你的变量的键名。
这里我创建了一个控制台应用程序供您演示。
class Program
{
static void Main(string[] args)
{
Dictionary<string, string> dictSettings = new Dictionary<string, string>();
string MyAlpa = "";
string MyBravo = "";
string MyCharlie = "";
string MyDelta = "";
var lines = File.ReadAllLines(@"C:\Users\xxx\source\repos\ConsoleApp4\ConsoleApp4\Files\Sample.txt");
for (var i = 0; i < lines.Length; i += 1)
{
var line = lines[i];
//DoesLineExist(line);
if (!string.IsNullOrEmpty(line) && line.Contains(":"))
{
string settingKey = line.Split(':')[0];
string settingValue = line.Split(':')[1];
dictSettings.Add(settingKey, settingValue);
}
}
MyAlpa = dictSettings.ContainsKey("SettingA") ? dictSettings["SettingA"] : "";
MyBravo = dictSettings.ContainsKey("SettingB") ? dictSettings["SettingB"] : "";
MyCharlie = dictSettings.ContainsKey("SettingC") ? dictSettings["SettingC"] : "";
MyDelta = dictSettings.ContainsKey("SettingD") ? dictSettings["SettingD"] : "";
Console.WriteLine(MyAlpa);
Console.WriteLine(MyBravo);
Console.WriteLine(MyCharlie);
Console.WriteLine(MyDelta);
Console.ReadLine();
}
//private static void DoesLineExist(string line)
//{
// if (!string.IsNullOrEmpty(line) && line.Contains(":"))
// {
// string settingKey = line.Split(':')[0];
// string settingValue = line.Split(':')[1];
// dictSettings.Add(settingKey, settingValue);
// }
//}
}
输入:
SettingA:Alpha1
SettingB:Bravo2
SettingC:Charlie1
输出:
输入:
SettingA:Alpha1
SettingC:Charlie1
SettingD:
输出: