Файл SARSING .INI с использованием LINQC#

Место общения программистов C#
Ответить
Anonymous
 Файл SARSING .INI с использованием LINQ

Сообщение Anonymous »

Я пытаюсь проанализировать файл INI и взять конкретные пары клавиш, учитывая имя раздела и имя ключа. Я использую следующий код, используя LINQ, и он работает, если я не включаю ключевое имя в его поиск, но возвращаю пустой список, если я сделаю.[INSTANCES]
NUMVTC=3
VTC=0,3330,ABCD,DESCR0
VTC=1,3331,EFGH,DESCR1
VTC=2,3332,IJKL,DESCR2
< /code>
Частичный код для анализа файла < /p>
List vals = File.ReadLines(sMappingFilePath)
.SkipWhile(line => !line.StartsWith("[instances]",
StringComparison.CurrentCultureIgnoreCase))
.Skip(1)
.TakeWhile(line => !string.IsNullOrEmpty(line) && line.StartsWith("vtc", StringComparison.CurrentCultureIgnoreCase)) // The "vtc" portion breaks it
.Select(line => new IniEntry(line.Split('=')[0], line.Split('=')[1])).ToList();

public class IniEntry
{
public string Key { get; set; }
public string Value { get; set; }

public IniEntry(string key, string val) {
Key = key;
Value = val;
}
}

Если я удалю часть, в которой говорится «line.startswith (« vtc »...», она работает и возвращает все пары клавишных значений, включая numvtc = 3, который я хочу пропустить. /> update < /strong> < /p>
Я изменил код на основе предложений и комментариев и попал в общую функцию, которая принимает путь .ini файла, имя раздела и имя ключа и список возврата на объектах Inientry. < /p>
public static List GetIniSectionDataList(string sIniFilePath, string sSection, string sKey)
{
List ls = new List();

if (string.IsNullOrEmpty(sIniFilePath))
{
return ls;
}
// In case your enters **[blah** , or **blah]**
sSection = sSection.Replace("[", string.Empty).Replace("]", string.Empty);
sSection = "[" + sSection + "]";

ls = File.ReadLines(sIniFilePath)
.SkipWhile(line => !line.StartsWith(sSection, StringComparison.CurrentCultureIgnoreCase))
.Where(line => line.StartsWith(sKey, StringComparison.CurrentCultureIgnoreCase))
//.Skip(1)
.TakeWhile(line => !string.IsNullOrEmpty(line))
.Select(line => new IniEntry(line.Split('=')[0], line.Split('=')[1]))ToList();

return ls;
}
< /code>
Я называю его с помощью: < /p>
List vals = TCLogFile.GetIniSectionDataList(sMappingFilePath, "instances", "vtc");


Подробнее здесь: https://stackoverflow.com/questions/796 ... using-linq
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»