Как прочитать схему плоского файла с помощью отражения в C # - PullRequest
1 голос
/ 24 ноября 2008

Как читать схему плоского файла, используя Reflection в C # Краткий обзор, который у меня есть, - это какой-то сервер, который хранит данные в виде плоских файлов, и я должен передать данные из SQL Server в эти плоские файлы. Для этого мне нужно знать их схему. Я понятия не имею об этом, любая помощь будет отличной.

1 Ответ

3 голосов
/ 24 ноября 2008

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

В результате этот ответ в основном является догадкой и, вероятно, будет развиваться по мере того, как вы будете раскрывать больше информации. Это отлично; Вы не можете получить ответ (42), пока не узнаете, что это за вопрос.

Не существует единого определения, что такое плоский файл. Вероятно, вам нужна функция, которая анализирует «записи» в файле. Обычный подход - открыть файл в шестнадцатеричном редакторе и вывести формат из нескольких примеров записей. Ищите подсказки относительно формы повторяющегося узора. Кажется ли, что каждая «запись» состоит из нескольких «полей»? Появляются ли они в определенном порядке каждый раз, или каждое поле имеет префикс имени или номера, чтобы указать, что это значит? Похоже ли это на обычный текст, т.е. вы можете открыть его в Блокноте, не теряя важную информацию?

Объявите класс для представления записи:

public class FlatFileRecord
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    // etc.
}

Затем напишите функцию, которая читает из потока и выдает записи:

public static IEnumerable<FlatFileRecord> ParseFlatFile(StreamReader stream)
{
    // etc.

Было бы целесообразно использовать StreamReader, если файл представляет собой «обычный текст» (т. Е. Содержит символы возврата каретки / перевода строки, которые используются каким-либо существенным образом для разделения записей или полей).

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

string line;
while ((line = r.ReadLine()) != null)
    yield return new FlatFileRecord(line);

Это разбивает проблему на два уровня. Внешний уровень проходит через строки по одному, каждый из которых производит одну запись. Тогда есть внутренний уровень, который я представлял себе в конструкторе FlatFileRecord. Передайте строку, и она заполняется значениями полей, которые она знает, как извлечь из этой строки. Итак, теперь вам нужно написать конструктор FlatFileRecord.

...