2014-01-19 4 views
7

Есть ли 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?

+0

Непонятно, зачем вам здесь полный awk - не можете ли вы просто использовать регулярные выражения и извлекать значения из групп? См. 'System.Text.RegularExpressions.Regex' –

+0

Да, конечно, я мог бы просто реализовать все это в C#, например. в генераторе с циклом for и логической переменной состояния 'if (inPrepackaged) continue;'. Это был не вопрос моего вопроса, хотя:) – johv

+0

Этот вид микса довольно странный, ИМО. Вы можете сделать то же самое с TakeWhile/SkipWhile и довольно маленьким регулярным выражением (или просто сплитом). ** Вам не нужно AWK ** (если вы не хотите сохранить такой же синтаксис), но вам может потребоваться ** переписать выражение AWK в LINQ-режиме ** (нет необходимости в переменных состояния и тому подобное, просто присоединяется) , –

ответ

Смежные вопросы