c # как поместить несколько групп слов из текстового файла в массивы - PullRequest
2 голосов
/ 12 января 2012

у меня есть текстовый файл, содержащий слова такого типа

PEOPLE
John
0218753458
ENTERPRISE
stock
30%
HOME
Indiana
West Virginia
PEOPLE
Vahn
031245678
ENTERPRISE
Inc
50%
HOME
melbourne
Australia

Я хочу разделить эти файлы на несколько строк, которые будут разделены на группы PEOPLE, ENTERPRISE и HOME например, вывод будет

часть [0]

 PEOPLE
 John
 0218753458

часть [1]

ENTERPISE
stock
30%

часть [2]

HOME
Indiana
West Virginia

и т. Д.

У меня есть план использования

РЕДАКТИРОВАТЬ # 1 (спасибо @Slade)

string[] part = s.Split(new string[] { "PEOPLE","ENTERPRISE","HOME" }, StringSplitOptions.None);

я не могу изменить структуру. Есть ли способ сохранить заголовок? или лучший способ сделать это?

Ответы [ 4 ]

2 голосов
/ 12 января 2012

Не используйте оператор ||, это для условных / логических выражений ИЛИ. Вместо этого при заполнении элементов массива, как вы делаете, используйте запятую, например, так:

string[] part = s.Split(new string[] { "PEOPLE", "ENTERPRISE", "HOME" }, StringSplitOptions.None);

Однако, если у вас не всегда будут эти заголовки, это не хороший способ разбить ваш текстовый файл. Вместо этого вам нужно определить некоторую структуру вашего файла. Например, если у вас всегда будут заголовки в FULL CAPS, то вы можете начать с разделения вашего текстового файла на строки, затем циклически проходить по каждому элементу и группировать элементы каждый раз, когда вы нажимаете строку, содержащую только символы в FULL CAPS .

Лично, если это возможно, я бы изменил структуру текстового файла, чтобы вы могли помечать заголовки каким-либо символом до или после: например, :THIS IS A HEADER. Таким образом, вы можете разбить на строки, а затем просто искать символ : в начале строки.

EDIT

Пример подхода к синтаксическому анализу с заголовками FULL CAPS см. В примере моего кода на PasteBin .

Примечание: строка ...

string[] lines = File.ReadAllLines(@"Sample.txt");

... можно заменить на ...

string textFromFile = File.ReadAllText(@"Sample.txt");
string[] lines = textFromFile.Split(new string[1] { System.Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
1 голос
/ 12 января 2012

Используя регулярное выражение и потому что вы хотите сохранить разделенные строки в результатах:

string[] tmp = Regex.Split(originalString, @"(PEOPLE|ENTERPRISE|HOME)");

List result = new List();
for(var i = 1; i < tmp.Count() - 1; i += 2) {
    result.Add(tmp[i] + tmp[i+1]);
}

Это дает вам желаемый результат.

Причина, по которой я объединяю массив tmp, заключается в том, что начиная с .NET 2.0 Regex.Split будет возвращать разделенные строки как часть массива. Я также начинаю индексирование с 1, потому что мы хотим, чтобы наша конкатенация произошла поздно

0 голосов
/ 12 января 2012

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

var peopleList = new List<string>();
var enterpriseList = new List<string>();
var homeList = new List<string>();
List<string> workingList = null;

using (var reader = new StreamReader("input.txt"))
{
    string line = reader.ReadLine();
    while (line != null)
    {
        switch (line)
        {
            case "PEOPLE": { workingList = peopleList; } break;
            case "ENTERPRISE": { workingList = enterpriseList; } break;
            case "HOME": { workingList = homeList; } break;

            default: { workingList.Add(line); } break;
        }

        line = reader.ReadLine();
    }
}

Исходя из вашего выборочного ввода, он заполнит три списка следующим образом:

peopleList = { "John", "0218753458", "Vahn", "031245678" }
enterpriseList = { "stock", "30%", "Inc", "50%" }
homeList = { "Indiana", "West Virginia", "melbourne", "Australia" }
0 голосов
/ 12 января 2012
s.Split(new string[] {"PEOPLE", "ENTERPRISE", ... }, StringSplitOptions.RemoveEmptyEntries);

И если вы хотите сохранить сами заголовки, чем возможно, будет предпочтительнее разбить вашу строку по нескольким аргументам и добавить заголовок руками. Например, вы разделяете свою строку по людям и добавляете заголовок людей к каждому чанку. Затем разделите каждый кусок по HOME и добавьте заголовок HOME руками и т. Д.

...