2017-02-09 2 views
2

Как получить весь текст из документа, связанного с строкой. Я пытаюсь разделить текст по точкам: string[] words = s.Split('.'); Я хочу взять этот текст из текстового документа. Но если мой текст документа содержит пустые строки между строками, например:Как связаться с целым текстом из файла в строку, избегая пустых строк beetwen строк

pat said, “i’ll keep this ring.” 

she displayed the silver and jade wedding ring which, in another time track, 
she and joe had picked out; this 

much of the alternate world she had elected to retain. he wondered what - if any - legal basis she had kept in addition. none, he hoped; wisely, however, he said nothing. better not even to ask. 

результат выглядит следующим образом:

1. pat said ill keep this ring 
2. she displayed the silver and jade wedding ring which in another time track 
3. she and joe had picked out this 
4. much of the alternate world she had elected to retain 
5. he wondered what if any legal basis she had kept in addition 
6. none he hoped wisely however he said nothing 
7. better not even to ask 

но нужный правильный вывод должен быть таким:

1. pat said ill keep this ring 
2. she displayed the silver and jade wedding ring which in another time track she and joe had picked out this much of the alternate world she had elected to retain 
3. he wondered what if any legal basis she had kept in addition 
4. none he hoped wisely however he said nothing 
5. better not even to ask 

Так для этого сначала мне нужно обработать содержимое текстового файла, чтобы получить весь текст в виде отдельной строки, например:

pat said, “i’ll keep this ring.” she displayed the silver and jade wedding ring which, in another time track, she and joe had picked out; this much of the alternate world she had elected to retain. he wondered what - if any - legal basis she had kept in addition. none, he hoped; wisely, however, he said nothing. better not even to ask. 

Я не могу сделать это так же, как это было бы с содержанием списка, например: string concat = String.Join(" ", text.ToArray());,

Я не уверен, как связаться текст в строку из текстового документа

ответ

2

Я думаю, что это то, что вы хотите:

var fileLocation = @"c:\\myfile.txt"; 
var stringFromFile = File.ReadAllText(fileLocation); 

//replace Environment.NewLine with any new line character your file uses 
var withoutNewLines = stringFromFile.Replace(Environment.NewLine, ""); 

//modify to remove any unwanted character   
var withoutUglyCharacters = Regex.Replace(withoutNewLines, "[“’”,;-]", ""); 
var withoutTwoSpaces = withoutUglyCharacters.Replace(" ", " "); 

var result = withoutTwoSpaces.Split('.').Where(i => i != "").Select(i => i.TrimStart()).ToList(); 

Итак, сначала вы прочитали весь текст из файла, а затем удалить все ненужные символы, а затем разделить на . и возврата непустых элементов

+0

Вы предполагаете, что файл будет использовать те же символы новой строки, что и машина. Это приведет к сбою в Windows с файлами, которые используют '\ n' –

+0

Да, это зависит от конкретного файла. Но не стоит заменять «Environment.NewLine» новым символом строки, который используется в файле. – tomassino

1

Вы пробовали заменяя двойные новые строки перед расщеплением с использованием периода?

static string[] GetSentences(string filePath) { 
     if (!File.Exists(filePath)) 
      throw new FileNotFoundException($"Could not find file { filePath }!"); 

     var lines = string.Join("", File.ReadLines(filePath).Where(line => !string.IsNullOrEmpty(line) && !string.IsNullOrWhiteSpace(line))); 

     var sentences = Regex.Split(lines, @"\.[\s]{1,}?"); 

     return sentences; 
    } 

Я не проверял это, но он должен работать.


Пояснение: (! File.Exists (Filepath))

если бросить новый FileNotFoundException ($ "! Не удалось найти файл {Filepath}");

Выдает исключение, если файл не найден. Консультативно, что вы окружаете вызов метода с помощью try/catch.

вар строки = string.join ("", File.ReadLines (Filepath) .где (линия => string.IsNullOrEmpty (линия) & & string.IsNullOrWhiteSpace (линия))!);

Создает строку и игнорирует любые строки, которые являются чисто пустыми или пустыми.

var предложения = Regex.Split (lines, @ ". [\ S] {1,}?");

Создает строковый массив, где строка разбивается на каждый период и пробелы после периода.

например:.

Строка «Я пришел, я увидел.Я победил»стал бы

  1. Я пришел
  2. Я видел
  3. победил

Update:

Вот метод как однострочника, если это ваш стиль ?

static string[] SplitSentences(string filePath) => File.Exists(filePath) ? Regex.Split(string.Join("", File.ReadLines(filePath).Where(line => !string.IsNullOrEmpty(line) && !string.IsNullOrWhiteSpace(line))), @"") : null; 
+0

IsNullOrWhitespace также проверяет пустые строки. Вам не нужно 'IsNullOrEmpty' –

+0

Это приведет к созданию строки, содержащей' '' или ','. В примере вывода они отсутствовали, поэтому я предполагаю, что этот метод не работает. –

+0

@ m.rogalski Нет, я не думаю Пустые строки отфильтровываются до разделения через период и пробелы. И даже так, простая. Где (x =>! string.IsNullOrEmpty (x)) будет делать трюк. – SimonC

1

Я хотел бы предложить вы перебираете все символы и просто проверяете, находятся ли они в диапазоне 'a' >= char <= 'z' или char == ' '. Если это соответствует условию затем добавить его к вновь созданной строки еще проверки, если это '.' характер и, если она затем закончить линию и добавить еще один:

List<string> lines = new List<string>(); 
string line = string.Empty; 
foreach(char c in str) 
{ 
    if((char.ToLower(c) >= 'a' && char.ToLower(c) <= 'z') || c == 0x20) 
     line += c; 
    else if(c == '.') 
    { 
     lines.Add(line.Trim()); 
     line = string.Empty; 
    } 
} 

Working online example

Или, если вы предпочитаете " однострочные:

IEnumerable<string> lines = new string(str.Select(c => (char)(((char.ToLower(c) >= 'a' && char.ToLower(c) <= 'z') || c == 0x20) ? c : c == '.' ? '\n' : '\0')).ToArray()).Split('\n').Select(s => s.Trim()); 
1

Возможно, я ошибаюсь. Я думаю, что вы можете не захотеть изменить строку, если вы ее раскалываете. Например, в части строки есть двойная/одинарная кавычка ("). Удаление их не может быть желательны, который воспитывает, возможно, вопрос, чтение текстового файла, содержащий одинарные/двойные кавычки (как ваш пример текстовых данных показывает), как показано ниже:

var stringFromFile = File.ReadAllText(fileLocation); 

не будет отображать эти символы должным образом в текстовое поле или консоль, поскольку кодировка по умолчанию с использованием метода ReadAllText - UTF8. Например, одиночные/двойные кавычки будут отображать (заменяющие символы) в виде бриллиантов в текстовом поле формы и будут отображаться как знак вопроса (?) При отображении на консоль. Чтобы одинарные/двойные кавычки и они отображаются должным образом, вы можете получить кодировку для текущей кодировки ANSI операционной системы путем добавления параметра в ReadAllText метода, как показано ниже:

string stringFromFile = File.ReadAllText(fileLocation, ASCIIEncoding.Default); 

Ниже код, используя простой метод разделения на .split строку в периоды (.) Надеюсь, это поможет.

private void button1_Click(object sender, EventArgs e) { 
    string fileLocation = @"C:\YourPath\YourFile.txt"; 
    string stringFromFile = File.ReadAllText(fileLocation, ASCIIEncoding.Default); 
    string bigString = stringFromFile.Replace(Environment.NewLine, ""); 
    string[] result = bigString.Split('.'); 
    int count = 1; 
    foreach (string s in result) { 
    if (s != "") { 
     textBox1.Text += count + ". " + s.Trim() + Environment.NewLine; 
     Console.WriteLine(count + ". " + s.Trim()); 
     count++; 
    } 
    else { 
     // period at the end of the string 
    } 
    } 
} 
Смежные вопросы