• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Import danych tekstowych zapisanych w określony sposób vb .net

VPS Starter Arubacloud
0 głosów
518 wizyt
pytanie zadane 2 stycznia 2019 w Visual Basic przez kamkow8 Początkujący (340 p.)

Próbuję napisać program w visual studio 2017 przy pomocy vb .net i .net framework 4.7. Jedną z czynności, które program miałby wykonywać to import pliku tekstowego .txt o określonym sposobie zapisie danych. Przykład danych:

23.17 142.89
45.74 -32.26

Dane w jednym wierszu dotyczą jednego punktu, przy czym pierwsza wartość to x, a druga to y. Kolejny wiersz to kolejny punkt. Chciałbym, aby program umożliwiał import współrzędnej po współrzędnej oraz wiersz po wierszu tak, że najpierw jest importowana współrzędna x (23.17), robione są na niej jakieś działania matematyczne, następnie importowana jest współrzędna y (ponownie działania matematyczne), a następnie czynności są powtarzane dla kolejnego wiersza.

Do samego wybrania pliku zastosowałem następujący kod:

Dim dlg As New OpenFileDialog()
        dlg.Filter = String.Empty   
        dlg.Filter = "txt|*.txt"    
        dlg.ShowDialog()

Niestety nie wiem jak mogę zaimportować wybrany plik do programu oraz aby program wykonał wyżej opisane czynności z liczbami, a w przypadku, gdyby ułożenie danych w  pliku tekstowym było inne np.:

23,17 142,89
45.74,-32.26

to pokazał by błąd. Jest ktoś wstanie mi pomóc?

komentarz 11 stycznia 2019 przez MikDal Mądrala (5,660 p.)
Pamiętaj, że jak uzyskałeś odpowiedź to zaznacz poprawną odpowiedź, a jak nie, to jakie masz jeszcze pytania?

3 odpowiedzi

+2 głosów
odpowiedź 3 stycznia 2019 przez MikDal Mądrala (5,660 p.)
wybrane 2 lutego 2019 przez kamkow8
 
Najlepsza

EDYCJA: Specjalnie dla Ciebie nauczyłem się tych podstaw Visual Basic, aby podzielić się z Tobą rozwiązaniem :)

Całość wygląda w następujący sposób:

  1. Tworzę sobie klasę, w której będę przechowywał dane na temat punktu,
  2. Odczytuję dane w funkcji linijka po linijce z pliku,
  3. Wyświetlam dane w funkcji Main.
Public Class PointF
    Public XValue As Double
    Public YValue As Double

    Public Sub New(ByVal x As Double, ByVal y As Double)
        XValue = x
        YValue = y
    End Sub

    Public Overrides Function ToString() As String
        Return String.Format("{0} x {1}", XValue, YValue)
    End Function

End Class
Sub Main()
    For Each pt As PointF In GetPointsFromFile("myfile.txt")
        Console.WriteLine(pt)
    Next
End Sub

Public Iterator Function GetPointsFromFile(ByVal path As String) As IEnumerable(Of PointF)
    Dim x As Single = Nothing, y As Single = Nothing

    For Each line In System.IO.File.ReadLines(path)
        Dim pointsStr As String() = line.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)

        If pointsStr.Length <> 2 Then
            Throw New Exception($"Błąd w linii {line} brak dwóch punktów")
        End If

        If Not Single.TryParse(pointsStr(0), x) Then
            Throw New Exception("Nie udało sie odczytać wartości X")
        End If

        If Not Single.TryParse(pointsStr(1), y) Then
            Throw New Exception("Nie udało sie odczytać wartości Y")
        End If

        Yield New PointF(x, y)
    Next
End Function

Zaletą takiego rozwiązania jest własnie przetwarzanie linijki po linijce, także bez większych problemów można sobie poradzić z dużymi plikami (nie sprawdzałem w tym przypadku). Jako ciekawostkę właśnie chciałbym zaznaczyć linijkę z yield, które to pozwala na takie ciekawe przetwarzanie.

Nie wiem jak mogę podzielić dany wiersz, aby możliwe było zliczenie wyrazów w wierszu. Chodzi mi o to, że w przypadku, gdy w którymś wierszu była by jedna liczba np. 24.18 oraz, gdyby były  3 liczby np. 23.6 1.21 -7.20 to wyskoczyłby by błąd. W skrócie: Jeśli ciąg wyrazów w danym wierszu jest różny od dwóch to wyskakuje błąd o niepoprawnych danych

Za sprawdzenie ile wartości znajduje się w jednej linijce odpowiada If pointsStr.Length <> 2 Then.

Nie wiem jak mogę określić znaki, które zostałyby wyłapane za błąd. W sensie, że jeśli poszczególne liczby będą oddzielone przecinkiem albo kolejna wartość współrzędnej oddzielona innym znakiem niż spacja to również zostanie to zakwalifikowane jako błąd.

Aktualnie tym zajmuje się funkcja Single.TryParse(pointsStr(0), x). Jeśli pojawią się jakiekolwiek niedozwolone znaki to dojdzie do wyrzucenia wyjątku.

komentarz 5 stycznia 2019 przez kamkow8 Początkujący (340 p.)

Dopiero teraz miałem chwilę do tego zasiąść. Dziękuję za odpowiedź, jednak wystąpił u mnie błąd z przeciążeniem w line.Split. Informacja o błędzie:

Nie wiem jak mogę to rozwiązać, ponieważ nie rozumiem za bardzo zapisu (" "c,

komentarz 6 stycznia 2019 przez MikDal Mądrala (5,660 p.)

Nie pisałem nic nigdy w VB, ale po krótkim spojrzeniu w dokumentację mamy taki przykład

Option Strict On  
Dim charVar As Char 
' The following statement succeeds because it specifies a Char literal.  
charVar = "Z"C  

co wskazuje na to, że zapis " "c oznacza, że wymuszamy konwersję z stringu " " na znak ' '.

W połączeniu z częścią dokumentacji wychodzi na to, co można by wyczytać z błędu kompilatora: brak jest funkcji string.split dla parametrów char i string, potrzebujemy dwóch stringów. Spróbuj osunąć c z tej linijki i zostaw samo " ".

komentarz 2 lutego 2019 przez kamkow8 Początkujący (340 p.)

@MikDal, Wybacz, że po takim czasie. Po lekkiej edycji działa tak jak chciałem (z możliwością wyboru pliku do odczytu). Jesteś wielki! Dzięki :)

0 głosów
odpowiedź 3 stycznia 2019 przez areklipno Stary wyjadacz (11,930 p.)

Na początku musisz odczytać nazwę pliku z dlg. Potem masz do dyspozycji klasę System.IO.StreamReader. W internecie jest masę przykładów jak możesz tego używać...

Co do odczytanych liczb - pewnie będzie trzeba dla każdego wiersza w pliku użyć funkcji split, przy użyciu zakładanych separatorów. A później każdych string powstały po splicie sprawdzić czy jest liczbą (np. decimal.TryParse() ).

*Mam nadzieję, że nie zrobiłem literówek (Visual Studio samo podpowiada składnie i rzadko piszę funkcję w całości)

 

0 głosów
odpowiedź 5 stycznia 2019 przez kamkow8 Początkujący (340 p.)

Bazując m.in. na waszych odpowiedziach napisałem takie coś:

        Dim dlg As New OpenFileDialog()
        dlg.Filter = "txt|*.txt"    'pokazuje pliki w formacie txt
        If (dlg.ShowDialog = DialogResult.OK) Then
            Dim fileReader As System.IO.StreamReader
            fileReader = My.Computer.FileSystem.OpenTextFileReader(dlg.FileName)
            Dim stringReader As String
            For Each line In dlg.FileName
                stringReader = fileReader.ReadLine
                If stringReader <> Nothing Then
                    Dim pointsStrs As String() = stringReader.Split(New Char(), " "c)
                    Dim pointsStr As String
                    Dim liczba As Double
                    Dim sumaciagu As Double
                    For Each pointsStr In pointsStrs
                        liczba = CDbl(Val(pointsStr))
                        MsgBox(liczba)
                    Next
                End If
            Next
        End If

Dzięki temu otwieram eksplorator plików, z którego wybieram plik w formacie .txt. Następnie jest on dzielony na wyrazy, które w wybranym pliku są oddzielone spacją. Wyrazy te następnie są zamieniane na liczby i wyświetlane jedna po drugiej. Niestety więcej nie jestem wstanie przerobić/zrobić z waszych odpowiedzi. Czego mi brakuje?

- W zasadzie liczby są wyświetlane jedna po drugiej (pierwsza x potem y, następnie znowu x, potem znowu y) jednak nie wiem jak je przypisać w danym momencie do tej zmiennej x/y, żeby później robić na niej działania. 

- Nie wiem jak mogę podzielić dany wiersz, aby możliwe było zliczenie wyrazów w wierszu. Chodzi mi o to, że w przypadku, gdy w którymś wierszu była by jedna liczba np. 24.18 oraz, gdyby były  3 liczby np. 23.6 1.21 -7.20 to wyskoczyłby by błąd. W skrócie: Jeśli ciąg wyrazów w danym wierszu jest różny od dwóch to wyskakuje błąd o niepoprawnych danych

- Nie wiem jak mogę określić znaki, które zostałyby wyłapane za błąd. W sensie, że jeśli poszczególne liczby będą oddzielone przecinkiem albo kolejna wartość współrzędnej oddzielona innym znakiem niż spacja to również zostanie to zakwalifikowane jako błąd.

Wasze odpowiedzi duży mi dały, jednak jak widać jestem początkujący, a w internecie wszystkiego znaleźć niestety nie mogę. Pozdrawiam.

komentarz 18 stycznia 2019 przez MikDal Mądrala (5,660 p.)
Twoja odpowiedź powinna być edycją pytania, więc jeśli możesz to zrobić to byłoby miło :). Zmodyfikowałem swoją odpowiedź, taka by zawrzeć całościowe rozwiązanie :). Spójrz na nią.

Podobne pytania

0 głosów
1 odpowiedź 241 wizyt
0 głosów
2 odpowiedzi 141 wizyt

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...