Zapisywanie z pliku csv do poszczegolnych tablic zawartość kolumn

0

witam
Otóż chcę zapisać dane z pliku csv do poszczególnych tablic (każdej kolumnie przyporządkowana jest tablica ewentualnie może też być lista zamiast tablicy i poszczególne dane w komórkach mają być w nich zapisane). Wartości w każdej kolumnie są inne (string, int, bool).

Kolintow     ,Kolstringow ,Kolbool itd.
Row1Value1,Row1Value2,Row1Value3
Row2Value1,Row2Value2,Row2Value3
Row3Value1,Row3Value2,Row3Value3

I moje pytanie jest takie jak najlepiej zrobić takie zapisywanie(żeby później bez problemu operować na tych warotsciach)?

Bo myślałem tak żeby zapisać do stringu plik streamreaderem później przecinkami oddzielić i zapisać do tablicy ale to nie da efektu jaki bym chcial bo zapisze wszystko do jednej tablicy, a nie wiem jak zrobic zeby bylo kolumnami

napisałem coś takiego żeby co 4 element w tablicy był dodawany do poszczególnej listy chyba, że 5 element jest typu int to dodaje tez do tablicy i zwieksza o 1 element tylko nie wiem dlaczego mi to nie działa ( coś musiałem pomieszac a nie moge znaleźć tego błędu:(:

string[] file = sr.ReadToEnd().Split((new char[]{',','\n','\r'}),StringSplitOptions.RemoveEmptyEntries);
        
            
            List<DateTime> listDate = new List<DateTime>();
            List<DateTime> listHour = new List<DateTime>();
            List<int> listIntSum = new List<int>();
            List<int> listIntPrzyr = new List<int>();
            List<int> listIntBled = new List<int>();
            
            int j = 0;
            int z = 0;
            
            for (int i = 0; i < file.Length;i++ )
            {
               
                if (i == 0 || z + j + 4 == i )
                {
                    listDate.Add(Convert.ToDateTime(file[i]));
                    
                }
                if (i == 1 || z + j + 4 + 1== i )
                {
                    listHour.Add(Convert.ToDateTime(file[i]));
                }
                if (i == 2 || z + j + 4 + 2 == i )
                {
                    listIntSum.Add(Convert.ToInt32(file[i]));
                }
                if (i == 3 || z + j + 4 +3 == i )
                {
                    listIntPrzyr.Add(Convert.ToInt32(file[i]));
                    Console.WriteLine(file[i]);
                }
                if ((i == 4 || z + j + 4 + 4 == i ) && (file[4].GetType() == typeof(int) || file[j + i].GetType() == typeof(int)))
                {
                    listIntBled.Add(Convert.ToInt32(file[i]));
                    j++;
                }
                if (i >= 4)
                {
                    z++;
                } 
2

Użyj metody string.Split() do rozdzielenia całego wiersza na kolumny.

0

Lepiej zastosuj XML'a

0

somekind a mógłbyś mi podpowiedzieć jak metodą .split podzielić na kolumny bo próbowałem i nie mogłem tego zrobić.

A i czy moglibyście mi napisać jaki błąd logiczny popełniłem w tych if-ach ? To tak dla mojej wiadomosci

1

Najpierw jeden split na wiersze później w pętli split każdego wiersza na kolumny.

0

to juz nikt nie idzie na latwizne i nie uzywa helperow?? https://www.nuget.org/packages/CsvHelper/

0

dzięki za odpowiedzi i jeszcze ostatnie 2 pytania mam do was
otóż chcę to dalej zrobić na piechotę i robię taką pętlę

for (int i = 0; i < file.Length; i++ )
            {
                if( i% 4 == 0) // co 4 wyrazenie jest datą 
                {
                    listDate.Add(Convert.ToDateTime(file[i])); // jak odrazu przy konwersji skrócić tutaj zapis typu DateTime żeby była sama data (bez czasu) 
                    
                }
              if( (i >= 5 && i % 5 == 0) || i == 1) // co 5 wyrażenie jest godziną i tutaj właśnie nie działa wywala mi błąd :( (lista jest typu DateTime;
                {
                    listHour.Add(Convert.ToDateTime(file[i])); // znaczy błąd dokładni tutaj a jak tylko wypisałem a nie konwertowalem to wypisuje mi jakoś dziwnie różne dane i nie wiem czemu(pierwsze 2 godziny wypisuje po czym błąd jak przy konwersji)
                }
            } 
0

listDate.Add(Convert.ToDateTime(file[i])).Date - to daje samą datę

Możesz pokazać kawałek tego swojego pliku?

0

już poradziłem sobie :)

0

dodałem

 if (z == 4)
                {
                    z = 0;
                } 

bo gdy z =>4 kończyło dodawanie do listy elementów.

string[] file = sr.ReadToEnd().Split((new char[]{',','\n','\r'}),StringSplitOptions.RemoveEmptyEntries);
        
            
            List<DateTime> listDate = new List<DateTime>();
            List<DateTime> listHour = new List<DateTime>();
            List<int> listIntSum = new List<int>();
            List<int> listIntPrzyr = new List<int>();
            List<int> listIntBled = new List<int>();
            List<IList> completeList = new List<IList>();

            int z = 0;
            for (int i = 0; i < file.Length; i++ )
            {
                if (z == 4)
                {
                    z = 0;
                }
                if ((i >= 8 && ((i + 4) % 4 == 0+z)) || i == 4)
                {
                    int value = 0;
                    if (int.TryParse(file[i], out value))
                    {
                        z++;
                        listIntBled.Add(value);
                        
                    }
                    else
                    {
                        listIntBled.Add(0);
                    }
                }
                if( (i% 4) == 0+z || i == 0) 
                {

                    
                    listDate.Add(Convert.ToDateTime(file[i]).Date);
                    
                }
                if( (i >= 5 && (i+3) % 4 == 0 +z) || i == 1)
                {
                    
                    listHour.Add(Convert.ToDateTime(file[i]));
                    
                }
                if ((i >= 6 && (i + 2) % 4 == 0+z) || i == 2)
                {
                    
                    listIntSum.Add(Convert.ToInt32(file[i]));

                }
                if ((i >= 7 && (i+1) % 4 == 0+z) || i ==3)
                {
                    
                    listIntPrzyr.Add(Convert.ToInt32(file[i]));
                }
                
            } 
1

@igorrr3, czemu utrudniasz sobie życie tworząc sobie listę wszystkich komórek z tego pliku, przetwarzając je w pętli for i odstawiając jakąś wyższą arytmetykę z indeksami?

Gdybyś przetwarzał plik tak, jak zwykło się przetwarzać pliki, czyli wiersz po wierszu, wystarczyłoby Ci tyle kodu:

var listDate = new List<DateTime>();
var listHour = new List<TimeSpan>();
var listIntSum = new List<int>();
var listIntPrzyr = new List<int>();

var lines = File.ReadAllLines(@".\Dane.csv");
foreach (var line in lines)
{
    var columns = line.Split(',');
    listDate.Add(DateTime.Parse(columns[0]));
    listHour.Add(TimeSpan.Parse(columns[1]));
    listIntSum.Add(int.Parse(columns[2]));

    if (!string.IsNullOrWhiteSpace(columns[3]))
    {
        listIntPrzyr.Add(int.Parse(columns[3]));
    }
}

A tak przy okazji, to co się dzieje z tymi danymi później? Bo zazwyczaj wiersze z CSV mapuje się po prostu do jakiejś klasy, a nie kolumny do elementów listy.

0

no właśnie chciałem zrobić coś takiego że jeśli wszystko będzie się zgadzać (nie będzie pustych linii w komorkach gdy jeszcze nie skończy czytać pliku, nie bedą innego typu zmienne w kolumnach) to przerzuca plik to folderu, a jesli bedzie cos zle przerzuca do innego i właśnie miałem te listy dodać do obiektu ale troche mi sie namieszało i nie wiem zabardzo co do czego ma być :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1