2016-01-17 2 views
1

В следующем коде я разбиваю текст на слова, вставляя их в таблицу отдельно и подсчитывая числа букв в каждом слове. Проблема в том, что счетчик также подсчитывает пробелы в начале каждой строки и дает неправильное значение для некоторых слов. Как я могу считать только буквы каждого слова?Как считать только буквы в строке?

var str = reader1.ReadToEnd(); 

char[] separators = new char[] {' ', ',', '/', '?'}; //Clean punctuation from copying 
var words = str.Split(separators, StringSplitOptions.RemoveEmptyEntries).ToArray(); //Insert all the song words into "words" string 
string constring1 = "datasource=localhost;port=3306;username=root;password=123"; 

using (var conDataBase1 = new MySqlConnection(constring1)) 
{ 
    conDataBase1.Open(); 
    for (int i = 0; i < words.Length; i++) 
    { 
     int numberOfLetters = words[i].ToCharArray().Length; //Calculate the numbers of letters in each word 
     var songtext = "insert into myproject.words (word_text,word_length) values('" + words[i] + "','" + numberOfLetters + "');"; //Insert words list and length into words table 
     MySqlCommand cmdDataBase1 = new MySqlCommand(songtext, conDataBase1); 
     try 
     { 
      cmdDataBase1.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
} 
+0

Является ли это только пространства у вас возникли проблемы с? Если так .Trim() строка сначала. –

+0

Если вы раскалываете и удаляете пустые записи, я, похоже, не вижу причин, почему он должен давать вам какие-либо пробелы, может быть, вы можете поделиться с нами всей линией и с чем она была разделена? –

+0

Как вы хотите посчитать «буквы», которые принимают более одного символа «char» (например, суррогатные пары или ненормированные акцентированные символы)? –

ответ

0

Это будет простой и быстрый способ сделать это:

int numberOfLetters = words[i].Count(word => !Char.IsWhiteSpace(word)); 

Другое простое решение, которое сэкономит вам выше, и остальные ответы здесь, будет Trim() первым, и чем сделайте свой обычный расчет, из-за вашего заявления, что это происходит только в начале каждой строки.

var words = str.Trim().Split(separators, StringSplitOptions.RemoveEmptyEntries); 

чем все, что вам нужно это: (без избыточного преобразования)

int numberOfLetters = words[i].Length; 
+0

Я думаю, что вы смешиваете материал, и это другая проблема, не связанная с подсчетом небелых пространств. Создайте новый пост, но сначала я рекомендую вам добавить некоторый вывод 'Console.WriteLine' на слово, которое вы вставляете, чтобы увидеть, действительно ли это проблема или что-то в вашем коде. Кроме того, принято отмечать ответ, который помог вам лучше всего + Upvote. –

+0

Спасибо, первое решение работает, но у меня все еще есть две проблемы. Последнее слово в каждой строке появляется в таблице с первым словом следующей строки. Я могу избежать этого, введя пробел в конце каждой строки. Вторая проблема, она также подсчитывает длину 0 для пустых слов. –

+0

Я не знаю, какой 'StreamReader' вы использовали при применении' ReadToEnd', я предположил, что он читается до конца строки, поэтому вам не нужно «обрабатывать» последнее слово с добавлением пробела в конце, потому что раскол делает вещи для вас. дважды проверьте сами, посмотрим, будет ли 'str' представлять 1 строку, если нет, то вам следует пересмотреть, как вы хотите обрабатывать случай из двух строк, которые были прочитаны' ReadToEnd'. –

0

См String.Trim()

int numberOfLetters = words[i].Trim().ToCharArray().Length; //Calculate the numbers of letters in each word 
+0

У меня все еще есть проблема. Последнее слово в каждой строке появляется в таблице с первым словом следующей строки. –

+0

Похоже, вы не раскалываете символ новой строки. Посмотрите, добавляет ли '\ n' ваши' разделители'. – Ian

0

вместо ' ' использовать '\s+', поскольку он соответствует один или несколько пробелов сразу, поэтому он расщепляется на любое количество пробельных символов.

Regex.Split(myString, @"\s+"); 
Смежные вопросы