Есть ли AWK-реализация для .NET?Встраиваемый awk для .NET?
Чтобы быть более конкретным, вот пример из рода проблем, которые я хочу, чтобы решить:
Article number Price Package day
10.1002-50 $50 Tuesday
10.1002-51 $40 Monday
10.1002-52 $50
10.1002-53 $50 Tuesday
#start prepackaged
20.2001-51 $1 Monday
20.2001-52 $30 Tuesday
10.1002-54 $10 Tuesday
10.1002-55
#end prepackaged
10.1001-50
10.1002-50 $50 Friday
10.1003-50
10.1004-50
Я хочу, чтобы получить номера статей, но пропустить расфасованных из них.
Вот как я предположил бы, что можно было бы решить с AWK-реализации имеющихся в C#:
using Awk.Extensions;
string[][] output = System.IO.File.ReadLines("C:\Temp\input.txt")
.Skip(1)
.Awk("/start prepackaged/,/end prepackaged/ {next}; {print $1}")
.Select(fields => fields[0])
.Distinct()
.ToArray();
foreach(var item in output)
{
Console.WriteLine(item);
}
Это позволило бы в идеале производить вывод:
10.1002-50
10.1002-51
10.1002-52
10.1002-53
10.1001-50
10.1003-50
10.1004-50
делает что-то подобное существует? Есть ли еще некоторые мощные, основанные на строках библиотеки сценариев для .NET, которые я должен рассмотреть?
Дальнейшее исследование показывает, что есть Jawk, a Java implementation of awk, который также может скомпилировать AWK-скрипты для Java-байт-кода! Кажется, есть direct port of this to C#, хотя он не кажется очень зрелым.
Еще один проект для Java, awk4j:
private static void case03() throws ScriptException {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("awk4j");
CompiledScript obj = ((Compilable) engine).compile("BEGIN{ printf ARGV[1] }"); // コンパイル
engine.put(ScriptEngine.ARGV, new String[] { "hello," });
obj.eval(); // コンパイル済みのスクリプトを実行
engine.put(ScriptEngine.ARGV, new String[] { "world!\n" });
obj.eval();
}
Вот аналогичный вопрос: Is there a .NET library which will give me the ability to run awk scripts in a .NET environment?
Непонятно, зачем вам здесь полный awk - не можете ли вы просто использовать регулярные выражения и извлекать значения из групп? См. 'System.Text.RegularExpressions.Regex' –
Да, конечно, я мог бы просто реализовать все это в C#, например. в генераторе с циклом for и логической переменной состояния 'if (inPrepackaged) continue;'. Это был не вопрос моего вопроса, хотя:) – johv
Этот вид микса довольно странный, ИМО. Вы можете сделать то же самое с TakeWhile/SkipWhile и довольно маленьким регулярным выражением (или просто сплитом). ** Вам не нужно AWK ** (если вы не хотите сохранить такой же синтаксис), но вам может потребоваться ** переписать выражение AWK в LINQ-режиме ** (нет необходимости в переменных состояния и тому подобное, просто присоединяется) , –