Я также не знаю, есть ли реализация C #, которая позволила бы вам сохранить управляемый код. Возможно, вам придется использовать неуправляемый импорт C / C ++.
я есть следующий файл и который нужно проанализировать
--TestFile
Start ASDF123
Name "John"
Address "#6,US"
end ASDF123
Строки начинаются с--
будут рассматриваться как строки комментариев. и файл начинается с «Пуск» и заканчиваетсяend
, Строка послеStart
этоUserID
а затемname
а такжеaddress
будет внутри двойных кавычек.
Мне нужно проанализировать файл и записать проанализированные данные в XML-файл.
Таким образом, полученный файл будет похож
<ASDF123>
<Name Value="John" />
<Address Value="#6,US" />
</ASDF123>
теперь я использую сопоставление с образцом (Regular Expressions
) для разбора вышеуказанного файла. Вот мой пример кода.
/// <summary>
/// To Store the row data from the file
/// </summary>
List<String> MyList = new List<String>();
String strName = "";
String strAddress = "";
String strInfo = "";
метод : ReadFile
/// <summary>
/// To read the file into a List
/// </summary>
private void ReadFile()
{
StreamReader Reader = new StreamReader(Application.StartupPath + "\\TestFile.txt");
while (!Reader.EndOfStream)
{
MyList.Add(Reader.ReadLine());
}
Reader.Close();
}
метод : FormateRowData
/// <summary>
/// To remove comments
/// </summary>
private void FormateRowData()
{
MyList = MyList.Where(X => X != "").Where(X => X.StartsWith("--")==false ).ToList();
}
метод : ParseData
/// <summary>
/// To Parse the data from the List
/// </summary>
private void ParseData()
{
Match l_mMatch;
Regex RegData = new Regex("start[ \t\r\n]*(?<Data>[a-z0-9]*)", RegexOptions.IgnoreCase);
Regex RegName = new Regex("name [ \t\r\n]*\"(?<Name>[a-z]*)\"", RegexOptions.IgnoreCase);
Regex RegAddress = new Regex("address [ \t\r\n]*\"(?<Address>[a-z0-9 #,]*)\"", RegexOptions.IgnoreCase);
for (int Index = 0; Index < MyList.Count; Index++)
{
l_mMatch = RegData.Match(MyList[Index]);
if (l_mMatch.Success)
strInfo = l_mMatch.Groups["Data"].Value;
l_mMatch = RegName.Match(MyList[Index]);
if (l_mMatch.Success)
strName = l_mMatch.Groups["Name"].Value;
l_mMatch = RegAddress.Match(MyList[Index]);
if (l_mMatch.Success)
strAddress = l_mMatch.Groups["Address"].Value;
}
}
метод : WriteFile
/// <summary>
/// To write parsed information into file.
/// </summary>
private void WriteFile()
{
XDocument XD = new XDocument(
new XElement(strInfo,
new XElement("Name",
new XAttribute("Value", strName)),
new XElement("Address",
new XAttribute("Value", strAddress))));
XD.Save(Application.StartupPath + "\\File.xml");
}
я слышал оParserGenerator
Пожалуйста, помогите мне написать парсер с использованием lex и yacc. Причина этого в том, что мой существующий парсер (Pattern Matching
не является гибким, более того, это не правильный путь (я так думаю).
Как я могу использоватьParserGenerator
(Я прочелПример проекта кода один а такжеПример проекта кода два но все же я не знаком с этим). Пожалуйста, предложите мне генератор парсеров, который выводит парсеры C #.