Выделение значений из FileHelpers?Или это из функциональности программ - PullRequest
1 голос
/ 09 февраля 2012

Мне интересно, смогу ли я отказаться от файловых помощников и сделать это сам, так как думаю, что я могу выйти за пределы того, для чего он предназначен.

Я хочу, чтобы пользователь мог загружать любой файл CSV (возможно,в будущем файл excel).Первая строка будет иметь заголовок

C1 C2 C3 C4 C5 C6

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

C1, C2, C3, C4, C5, C6 a, b, c, d, e, f

Теперь я хочу посмотреть на заголовок и в основном взять определенные.Например, я хочу C2, C3, C4. Остальное - дополнительная информация, которая меня не волнует.

Теперь кто-то может загрузить файл с таким заголовком

C1 C2 C3 C4

Опять я ищу толькоC2, C3, C4.

Я знаю, что у меня может быть несколько форматов, но я хочу, чтобы они были в состоянии загрузить любой файл с любым количеством заголовков (может быть 1000 для меня, все равно) итогда мое приложение попытается найти информацию, которая мне нужна (поэтому в случае 1000 заголовков мне может понадобиться только 3)

Возможно ли это?

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

(на основе комментариев shamp00)

Моя цель - заполнить столько данных, сколько я смогу определить, однако такие случаи могут произойти.Я хочу C1, C2, C3.Они дают файл с C1, C3, C4.Я получил 2 столбца данных, которые мне нужны, но у меня нет C2.

Теперь у меня было 2 идеи, одна из которых состояла в том, чтобы отобразить данные в 2 таблицы.Таблица 1 будет иметь C1, C2, C3, а таблица 2 будет иметь C1, C3, C4, и они в основном берут данные, которые они имеют в таблице 2, и перемещают соответствующие данные в мои ожидаемые столбцы.

При таком подходе IЯ в основном говорю: «Вы не дали мне 100% того, что я ожидал, теперь вы должны отформатировать каждую строку в мой формат».

Второй подход - 1 таблица и попытка заполнить столько данных, скольковозможный.

Например, пользователь загружает файл с C1, C3, C4.Я определила, что это 2 известных столбца, но у меня пока нет ожидаемых данных в полном объеме.

Поэтому я бы отобразил все строки обратно в html-таблице пользователю с заголовками * 1039.*

C1, C2, C3, C4

С1 будет заполнено, ячейки С2 будут пустыми (поскольку это данные, которые я пропускаю из них), С3 будет заполнено, С4 будет заполнено (эти данные были неожиданными, но ктознает, что на самом деле это могут быть данные, которые должен хранить C2, но, поскольку они неправильно написали имя заголовка, моя программа не смогла это выяснить)C4.

Теперь им нужно заполнить только 1 столбец, а не все столбцы, которые ожидаются.Таким образом, в некотором смысле мне нужен конкретный класс, как MyClass был с C1, C2, C3, но в то же время мне нужно динамическое, чтобы я мог держать C4,C5.....Cn.

Я бы всегда отображал C1, C2, C3сначала и остальные из этих неожиданных появятся после магии javascript и других вещей, которые они могут редактировать недостающую информацию.Если ничего не пропущено, они ничего не будут отображать для редактирования.

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

Тогда каким-то образом (пока не уверен на 100%) просто отследите, где находятся эти 3 столбца, которые меня действительно интересуют, чтобы я знал, что это за данные.

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

Я не знаком с FileHelpers, но я сделал нечто очень похожее на то, что вы описываете, используя инструмент под названием LogParser (http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=24659) в сочетании с моим собственным классом "DelimitedTextFileData". Если вы решите, что FileHelpers не собирается делайте то, что вам нужно, я бы порекомендовал вам в следующий раз заглянуть в LogParser, даже если он излишним для вашего текущего проекта, но это отличный инструмент для будущих проектов.

LogParser - это инструмент, который позволяет «SQL-подобные» запросы к различным источникам, включая текстовые файлы CSV. Это .exe на основе командной строки, но также поставляется с API, на который вы можете ссылаться в своем .NET-проекте. В моей ситуации я имел дело с текстовыми файлами, которые могут быть разделены любым символом, поэтому я разработал свой собственный класс, чтобы позволить мне указывать разделитель при создании экземпляра класса, а затем использовать простой API, чтобы задействовать более крупный API LogParser. Мне также пришлось анализировать файлы с неизвестным количеством (и именем) столбцов, поэтому в моем пользовательском классе есть функция для получения списка столбцов, найденных в файле. Возможно, вам не нужно предпринимать эти дополнительные шаги, если вы всегда имеете дело с CSV и точно знаете, какие столбцы вы хотите. Тем не менее, я был бы рад поделиться своим пользовательским классом, если хотите. просто дайте мне знать, как лучше его отправить.

LogParser предназначен для того, чтобы вы могли «запрашивать что-либо с использованием SQL-подобного синтаксиса», и мне пришло в голову, что одна из целей Linq - сделать то же самое. Вы искали в Интернете какие-либо библиотеки "Linq to Text File"? Если есть хороший, это может решить и вашу проблему.

1 голос
/ 09 февраля 2012

Вы можете использовать FileHelpers, используя метод, подобный описанному в мой ответ на ваш другой вопрос .

Вы читаете строку заголовка, чтобы определить, какие столбцы актуальны, а затем просмотрите полученный результатDataTable обработка только этих столбцов.

Что-то вроде

public class MyClass
{
    public string SomeImportantField { get; set; }
    public string SomeOtherField { get; set; }
    public string AnotherField { get; set; }
}

public IList<MyClass> GetObjectsFromStream(Stream stream)
{
    var cb = new DelimitedClassBuilder("temp", ",") { IgnoreFirstLines = 1, IgnoreEmptyLines = true, Delimiter = "," };
    var sr = new StreamReader(stream);
    var headerArray = sr.ReadLine().Split(',');
    foreach (var header in headerArray)
    {
        var fieldName = header.Replace("\"", "").Replace(" ", "");
        cb.AddField(fieldName, typeof(string));
    }

    var engine = new FileHelperEngine(cb.CreateRecordClass());

    List<MyClass> objects = new List<MyClass>();
    DataTable dt = engine.ReadStreamAsDT(sr);
    foreach (DataRow row in dt.Rows) // Loop over the rows.
    {
        MyClass myClass = new MyClass();
        for (int i = 0; i < row.ItemArray.Length; i++) // Loop over the items.
        {
            if (headerArray[i] == "ImportantField")
                myClass.SomeImportantField = row.ItemArray[i].ToString();
            if (headerArray[i] == "OtherField")
                myClass.SomeOtherField = row.ItemArray[i].ToString();
            if (headerArray[i] == "AnotherField")
                myClass.AnotherField = row.ItemArray[i].ToString();
            objects.Add(myClass);
        }
    }
    return objects;
}
...