Разделить строки из текстового файла - PullRequest
2 голосов
/ 16 сентября 2010

У меня есть следующие строки в текстовом файле "test"

Table Name.type
Market Drinks.tea

Я хочу разбить строки, чтобы получить следующий вывод

ObjectName = Table    AttributeName = Name    Attribute Type =type
ObjectName = Market   AttributeName = Drinks  Attribute Type =tea

вот мой код

            string[] lines = File.ReadAllLines(@"d:\test.txt");
            int i = 0;
            var items = from line in lines
                        where i++ != 0
                        select new{
                            objectName = line.Split(new char[] {' '})[0],
                            attrName = line.Split(new char[]{'.'})[1],
                            attrType = line.Split(new char[] { ' ' })[2]
                        };
            foreach (var item in items)
            {
                Console.WriteLine("ObjectName = {0}, AttributeName = {1}, Attribute Type = {2}",
                    item.objectName, item.attrName, item.attrType);
            }

Я получаю исключение вне границ.

PS: в конце строки в текстовом файле нет пробелов, я просто хотел проверить символ!

Ответы [ 6 ]

4 голосов
/ 16 сентября 2010

Вам не нужно окружение new char[] { ... }, потому что String.Split () использует params

Чтобы исправить индекс за пределами, последняя часть выбора должна стать:

        attrType = line.Split(' ', '.' )[2]

Редактировать

А благодаря @Kobi let позволит вам выполнить разделение всего один раз, что является большим улучшением, когда у вас много строк и / или столбцов.

var items = from line in lines
            where i++ != 0
            let words = line.Split(' ', '.')
            select new
            {
                objectName = words[0],
                attrName = words[1],
                attrType = words[2]
            };

Старый ответ

Вы можете использовать один и тот же разделитель для всех трех частей, что немного облегчает чтение:

       select new{
             objectName = line.Split(' ', '.' )[0],
             attrName   = line.Split(' ', '.' )[1],
             attrType   = line.Split(' ', '.' )[2]
        };
2 голосов
/ 16 сентября 2010

Используйте регулярные выражения, которые являются более устойчивыми:

        static void Main()
    {

        const string PATTERN = @"^([\w]+)\s+([\w]+)\.(\w+)";
        const string TEXT = "Table Name.type\r\nMarket Drinks.tea";

        foreach (Match match in Regex.Matches(TEXT, PATTERN, RegexOptions.Multiline))
        {
            Console.WriteLine("ObjectName = {0}   AttributeName = {1}  Attribute Type ={2}",
                match.Groups[1].Value, match.Groups[2].Value, match.Groups[3].Value);
        }

    }

Выходы:

ObjectName = Table   AttributeName = Name  Attribute Type =type
ObjectName = Market   AttributeName = Drinks  Attribute Type =tea
1 голос
/ 16 сентября 2010

Выход за пределы этой строки - attrType = line.Split(new char[] { ' ' })[2]

ваш attrType должен быть = line.Split(new char[] { '.' } )[1];

attrName должен быть = line.Split(new char[] {' '})[1].Split(new char[] {'.'})[0]

As HenkХолтерман сказал, что вам не нужно использовать новый символ [] внутри разбиения, чтобы ваши строки были -

attrType = line.Split('.')[1];
attrName = line.Split(' ')[1].Split('.')[0];
1 голос
/ 16 сентября 2010

В части разделения, вы должны сделать это следующим образом (при условии, что вы уверены, что ваш ввод в правильном формате):

attrName = line.Split(' ')[1].Split('.')[0],
attrType = line.Split(' ')[1].Split('.')[1]
0 голосов
/ 16 сентября 2010

, если вы хотите сделать так, просто используйте Regex, его более гибкий

const string pattern = @"(?<objectName>\w+)\s(?<attrName>\w+)\.(?<attrType>\w+)";

string[] lines = File.ReadAllLines(@"e:\a.txt");
var items = from line in lines
            select new
            {
                objectName = Regex.Match(line, pattern).Groups["objectName"].Value,
                attrName = Regex.Match(line, pattern).Groups["attrName"].Value,
                attrType = Regex.Match(line, pattern).Groups["attrType"].Value
            };

foreach (var item in items.ToList())
{
    Console.WriteLine("ObjectName = {0}, AttributeName = {1}, Attribute Type = {2}",
        item.objectName, item.attrName, item.attrType);
}
0 голосов
/ 16 сентября 2010

Спасибо за ответы здесь - правильный ответ для желаемого результата

objectName = line.Split(' ')[0],
attrName = line.Split(' ')[1].Split('.')[0],
attrType = line.Split('.')[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...