Чтение строки, заключенной в двойные кавычки, из текстового файла - PullRequest
0 голосов
/ 30 июля 2010

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

ID        Name          Path                                    IsTrue        Period
1         "1 yr"        "C:\\Program Files\\My File.xyz"        -1            2"
1         "1 yr"        "C:\\Program Files\\My File.xyz"        -1            2"

Теперь у меня есть следующий код для разделения строки

string[] ArrSeperators = { " " };
ArrSplitStrs = CurrStr.Split(ArrSeperators,
                             StringSplitOptions.RemoveEmptyEntries);

CurrStr представляет каждую строку текстового файла.

Проблема в том, что имя и путь разбиты на несколько строк, но они должны рассматриваться как одна строка.Я не могу вносить какие-либо изменения в файл, так как это стандартный файл для разных продуктов.

Я не понимаю, что могу сделать.

Ответы [ 3 ]

1 голос
/ 30 июля 2010

Используйте алгоритм, подобный этому:

Обрабатывает каждый символ каждой строки по одному.

Подсчитайте все, что вы найдете.

Если число «s нечетное, вы знаете, что вам нужно продолжать читать текущее поле, пока вы не нажмете другое».

Если число "s" четное, вы знаете, что как только вы попадаете в пробел, вы переходите к следующему полю.

Что-то вроде (могут быть ошибки - я только что записал это на макушке):

StringBuilder field = new StringBuilder();
int quoteCount = 0;

foreach (char c in line)
{
    if (c == '"')
    {
        quotCount++;
        continue;
    }

    if (quoteCount % 2 = 0)
    {
        if (c == ' ')
        {
            yield return field.ToString();
            field.Length = 0;
        }
        else
        {
            field.Append(c);
        }
    }
    else
    {
        field.Append(c);
    }
}

EDIT:

Вот хакерский пример, который работает для вашего примера - метод GetFields нуждается в некотором рефакторинге , и это далеко от качества всего, что я бы добавил в свой код, но основной принцип есть. *

class Program
{
    static void Main(string[] args)
    {
        var records = ReadFile(@"D:\x.txt");

        foreach (var record in records)
        {
            foreach (var field in record)
            {
                Console.Write(field + " | ");
            }

            Console.WriteLine();
        }

        Console.ReadKey();
    }

    static IEnumerable<IEnumerable<String>> ReadFile(String file)
    {
        using (var reader = new StreamReader(file))
        {
            // Ignore column titles line.
            reader.ReadLine();

            while (!reader.EndOfStream)
            {
                yield return GetFields(reader.ReadLine());
            }
        }
    }

    static IEnumerable<String> GetFields(String line)
    {
        Int32 quoteCount = 0;
        StringBuilder field = new StringBuilder();

        foreach (var c in line)
        {
            if (c == '"')
            {
                quoteCount++;
                continue;
            }

            if (quoteCount % 2 == 0)
            {
                if (c == ' ')
                {
                    if (field.Length > 0)
                    {
                        yield return field.ToString();
                        field.Length = 0;
                    }
                }
                else
                {
                    field.Append(c);
                }
            }
            else
            {
                field.Append(c);
            }
        }

        yield return field.ToString();
    }
}
0 голосов
/ 30 июля 2010

Попробуйте следующий код. Проверено на примере, представленном в вопросе ...

string CurrStr = "1         \"1 yr\"        \"C:\\Program Files\\My File.xyz\"        -1            2\"";
string[] ArrSplitStrs = CurrStr.Split('"');
int HighestCount = ArrSplitStrs.Count() % 2 == 0 ? ArrSplitStrs.Count() : ArrSplitStrs.Count() - 1;
for (int Counter = 1; Counter < HighestCount; )
{
    Console.WriteLine(ArrSplitStrs[Counter]);
    Counter += 2;
}
0 голосов
/ 30 июля 2010

Если для разделения полей используется разделитель табуляции, вы можете использовать '\ t'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...