2010-01-21 9 views
6

FileHelpers obsługuje funkcję o nazwie "RunTime Records", która umożliwia odczytanie pliku CSV do DataTable, gdy nie znasz układu do czasu wykonania.Dynamicznie twórz plik CSV z FileHelpers

Czy można użyć FileHelpers do utworzenia pliku CSV w czasie wykonywania w taki sam sposób?

Na podstawie danych wprowadzonych przez użytkownika plik CSV, który musi zostać utworzony, będzie miał inne pola, które będą znane tylko w środowisku wykonawczym. Mogę utworzyć potrzebny typ dla silnika FileHelper zgodnie z opisem w jego sekcji czytania, ale nie mogę określić, w jakim formacie muszą być zapisywane moje dane.

var engine = new FileHelpers.FileHelperEngine(GenerateCsvType()); 

engine.WriteStream(context.Response.Output, dontKnow); 

EDIT

Alternatywnie, może ktoś sugerują dobrą bibliotekę CSV, które można utworzyć plik CSV nie znając jej pola aż do wykonywania? Na przykład utwórz plik CSV z DataTable.

Odpowiedz

6

W rzeczywistości biblioteka pozwala dopiero teraz czytać rekordy uruchomieniowe ale do pisania purpouses można użyć metody DataTableToCsv takiego:

CsvEngine.DataTableToCsv(dt, filename); 

Pozwól mi wiadomo, czy to pomaga.

+0

Fantastyczne :) Jest to świetne rozwiązanie, ale czy istnieje jakiś sposób, aby napisać do strumienia zamiast? To nie jest złamanie umowy, ale zaoszczędziłoby to kilka kroków. Tak czy siak, dziękuję! –

+0

Nie w tej chwili, ale wyślij mi e-mail aktywnie pracujemy w następnej wersji biblioteki i bardzo łatwo byłoby dodać przeciążoną wersję metody do pisania strumieni :) – MarcosMeli

+0

@Marcos: jest następna wersja będzie wspierać ogólne listy ('List ') jako typ zwracany (zamiast tylko tablic) z FileEngine? :-) –

1

Wiem, że to stare pytanie, ale sam wpadłem na ten sam problem i spędziłem trochę czasu szukając rozwiązania, więc postanowiłem podzielić się swoimi odkryciami.

Jeśli używasz FileHelpers RunTime Records do utworzenia definicji, możesz wypełnić tę samą definicję za pomocą odbicia.

Na przykład jeśli utworzyć definicję

 DelimitedClassBuilder cb = new DelimitedClassBuilder("Customers", ","); 
     cb.AddField("StringField", "string"); 

     Type t = cb.CreateRecordClass(); 
     FileHelperEngine engine = new FileHelperEngine(t); 

Teraz można użyć tego samego typu utworzonego przez FileHelpers aby wypełnić swoje wartości w następujący sposób:

 object customClass = Activator.CreateInstance(t); 
     System.Reflection.FieldInfo field = customClass.GetType().GetField("StringField", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); 
     if (field != null) 
     { 
      field.SetValue(customClass, "StringValue"); 
     } 

A następnie zapisać go do pliku lub ciąg znaków: