Обработка строк в C # и VB.NET для меня проста, но понять, как сделать то же самое в F #, не так просто. Я читаю две книги Apress F # (Основы и Эксперт). Большинство образцов хрустят числами, и я думаю, что очень мало манипуляций со строками. В частности, образцы seq {sequence-expression} и Lists .
У меня есть программа на C #, которую я хочу преобразовать в F #. Вот что он делает:
- Открыть текстовый файл
- разделить файл абзацев, ищите CRLF между абзацами
- разделите строки абзаца, ищите. ! ? между строк
- слова, разделенные строкой, ищите пробел между словами "1016 *
- выводить количество абзацев, строк и слов
- Зацикливание набора слов, поиск и подсчет всех вхождений строки в коллекции, отметка местоположений найденного слова.
Вот простой пример того, что я могу сделать в C #, но еще не в F #.
Предположим, это текстовый файл:
Приказ Верховного суда округа Нью-Йорк
(Paul G Someone), поступил 18 марта,
2008, который в акции для личного
травмы, полученные в поездке и падении
над выбоиной, предположительно созданной
халатность подсудимых города или
Консолидированный МакФерсон и сторонний
действия Консолидедед Макферсон против
его подрядчик (Маллен), поскольку
обжаловано, отклонено, как несвоевременно,
Ходатайство Маллена о суммарном суждении
отклонение жалобы и
сторонняя жалоба, единогласно
подтверждено, без затрат.
Сторонам предоставляется большая свобода в
наметить их процедурный курс
через суды, по оговорке или
иначе. Таким образом, мы подтверждаем отрицание
движения Маллена как несвоевременного с
Маллен не предложил никаких оправданий покойному
подачи.
Я получаю этот вывод:
2 Paragraphs
3 Lines
109 Words
Found Tokens: 2
Token insofar: ocurrence(s) 1: position(s): 52
Token thus: ocurrence(s) 1: position(s): 91
Строки должны были называться предложениями: (
Есть несколько токенов. Я бы сказал, что более 100 сгруппированы по классам. Мне приходится перебирать один и тот же текст несколько раз, пытаясь сопоставить каждый токен. Вот части кода. Он показывает, как я делю предложения, помещаю их в ListBox, что помогает легко получить количество элементов. Это работает для абзацев, предложений и токенов. И это также показывает, как я полагаюсь на и для каждого. Именно такого подхода я хочу избежать, используя, если это возможно, seq {sequence-expression} и Lists и seq.iter или List.iter и все, что соответствует токену ... с этим необходимо.
/// <summary>
/// split the text into sentences and displays
/// the results in a list box
/// </summary>
private void btnParseText_Click(object sender, EventArgs e)
{
lstLines.Items.Clear();
ArrayList al = SplitLines(richTextBoxParagraphs.Text);
for (int i = 0; i < al.Count; i++)
//populate a list box
lstLines.Items.Add(al[i].ToString());
}
/// <summary>
/// parse a body of text into sentences
/// </summary>
private ArrayList SplitLines(string sText)
{
// array list tto hold the sentences
ArrayList al = new ArrayList();
// split the lines regexp
string[] splitLines =
Regex.Split(sText, @"(?<=['""A-Za-z0-9][\.\!\?])\s+(?=[A-Z])");
// loop the sentences
for (int i = 0; i < splitLines.Length; i++)
{
string sOneLine =
splitLines[i].Replace(Environment.NewLine, string.Empty);
al.Add(sOneLine.Trim());
}
// update statistics
lblLineCount.Text = "Line Count: " +
GetLineCount(splitLines).ToString();
// words
lblWordCount.Text = "Word Count: " +
GetWordCount(al).ToString();
// tokens
lblTokenCount.Text = "Token Count: " +
GetTokenCount(al).ToString();
// return the arraylist
return al;
}
/// <summary>
/// count of all words contained in the ArrayList
/// </summary>
public int GetWordCount(ArrayList allLines)
{
// return value
int rtn = 0;
// iterate through list
foreach (string sLine in allLines)
{
// empty space is the split char
char[] arrSplitChars = {' '};
// create a string array and populate
string[] arrWords = sSentence.Split(arrSplitChars, StringSplitOptions.RemoveEmptyEntries);
rtn += arrWords.Length;
}
// return word count
return rtn;
}
На самом деле это очень простое приложение для Windows. Форма с одним RichTextBox и тремя ListBox (абзацы, строки, найденные токены), метками для отображения вывода и одной кнопкой.