Jeg er i den uheldig at min leverdør kun laver sin vareliste i en csv fil og da den er meget stor og jeg skal have den lave om til en xml fil eller nåde anden jeg kan søge i
Nu er jeg ikke så stærk i .net enu. så jeg ville da blive glad hvis du kun give lidt mere hjælp gerne i form at en example da jeg er meget på bar bund.
1,"First line" 2,"One more" 3,"Again" 4,"More tricky with , in"
VB.NET kode:
Imports System Imports System.Collections.Generic Imports System.IO Imports System.Linq Imports System.Text
Namespace E Public Class Data Public Property Id As Integer Public Property Text As String End Class Public Class CSVReader Private stream As StreamReader Private fieldsep As Char Private strquote As Char Public Sub New(stream As StreamReader, fieldsep As Char, strquote As Char) Me.stream = stream Me.fieldsep = fieldsep Me.strquote = strquote End Sub Public Function ReadLine() As List(Of String) Dim line As String = stream.ReadLine() If line Is Nothing Then Return Nothing End If Dim res As New List(Of String)() Dim inq As Boolean = False Dim tmp As New StringBuilder("") For Each c As Char In line If c = fieldsep AndAlso Not inq Then res.Add(tmp.ToString()) tmp = New StringBuilder("") ElseIf c = strquote Then inq = Not inq Else tmp.Append(c) End If Next res.Add(tmp.ToString()) Return res End Function Public Function ReadLine(Of T As {Class, New})(ParamArray asgn As Action(Of String, T)()) As T Dim raw As List(Of String) = ReadLine() If raw Is Nothing Then Return Nothing End If Dim o As New T() For i As Integer = 0 To asgn.Length - 1 asgn(i)(raw(i), o) Next Return o End Function Public Function ReadAllLines(Of T As {Class, New})(ParamArray asgn As Action(Of String, T)()) As List(Of T) Dim res As New List(Of T)() Dim o As T = ReadLine(asgn) While o IsNot Nothing res.Add(o) o = ReadLine(asgn) End While Return res End Function Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, value As T) As T target = value Return value End Function End Class Public Class Program Public Shared Sub Main(args As String()) Using sr As New StreamReader("C:\work\data.csv") Dim csv As New CSVReader(sr, ","C, """"C) Dim data As List(Of Data) = csv.ReadAllLines(Of Data)( Sub(s, o) o.Id = Integer.Parse(s) End Sub, Sub(s, o) o.Text = s End Sub ) ' find the text for id 2 Console.WriteLine(data.Find(Function(r) r.Id = 2).Text) ' find all id's where text contains a 'm' or 'M' For Each o As Data In data.Where(Function(r) r.Text.ToLower().Contains("m"C)) Console.WriteLine(o.Id) Next End Using Console.ReadKey() End Sub End Class End Namespace
Jeg har fåde dit eksempel til at virker men når jeg bruger min csv fil får jeg et par fejl
Min class
Imports System Imports System.Collections.Generic Imports System.IO Imports System.Linq Imports System.Text
Namespace E2 Public Class Data Public Property Varenummer As Integer Public Property Varegruppenavn As String Public Property Varenavn As String Public Property Pris As Double Public Property Lagerstatus As String Public Property Vaegt As Double Public Property Modelbetegnelse As String End Class Public Class CSVReader Private stream As StreamReader Private fieldsep As Char Private strquote As Char Public Sub New(stream As StreamReader, fieldsep As Char, strquote As Char) Me.stream = stream Me.fieldsep = fieldsep Me.strquote = strquote End Sub Public Function ReadLine() As List(Of String) Dim line As String = stream.ReadLine() If line Is Nothing Then Return Nothing End If Dim res As New List(Of String)() Dim inq As Boolean = False Dim tmp As New StringBuilder("") For Each c As Char In line If c = fieldsep AndAlso Not inq Then res.Add(tmp.ToString()) tmp = New StringBuilder("") ElseIf c = strquote Then inq = Not inq Else tmp.Append(c) End If Next res.Add(tmp.ToString()) Return res End Function Public Function ReadLine(Of T As {Class, New})(ParamArray asgn As Action(Of String, T)()) As T Dim raw As List(Of String) = ReadLine() If raw Is Nothing Then Return Nothing End If Dim o As New T() For i As Integer = 0 To asgn.Length - 1 asgn(i)(raw(i), o) Next Return o End Function Public Function ReadAllLines(Of T As {Class, New})(ParamArray asgn As Action(Of String, T)()) As List(Of T) Dim res As New List(Of T)() Dim o As T = ReadLine(asgn) While o IsNot Nothing res.Add(o) o = ReadLine(asgn) End While Return res End Function Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, value As T) As T target = value Return value End Function End Class Public Class Program Public Shared Sub Main(args As String()) Using sr As New StreamReader("h:\work\mydata.csv") Dim csv As New CSVReader(sr, ","c, """"c) Dim data As List(Of Data) = csv.ReadAllLines(Of Data)( Sub(s, o) o.Varenummer = Integer.Parse(s) End Sub, Sub(s, o) o.Varenavn = s End Sub) ' find the text for id 2 ' Console.WriteLine(Double.Parse(data.Find(Function(r) r.Varenummer = 11426).Varenavn)) ' find all id's where text contains a 'm' or 'M' For Each o As Data In data.Where(Function(r) r.Varenavn.ToLower().Contains("m"c)) Console.WriteLine(o.Varenummer & " " & o.Varenavn & " " & o.Pris) Next End Using Console.ReadKey() Console.ReadLine() End Sub End Class End Namespace
den brokker sig når jeg prøver at køre med flere vare. og jeg kan ikke få pris med
Den brokker sig her o.Varenummer = Integer.Parse(s) 'Inputstrengen var ikke i et korrekt format. jeg har prøver at lave den om til string men det virker heller ikke
jeg ved ikke om det betyder nåde men første line er table info
Fedt.. Den brokker sig her o.Varenummer = Integer.Parse(s) 'Inputstrengen var ikke i et korrekt format. jeg har prøver at lave den om til string men det virker heller ikke
jeg ved ikke om det betyder nåde men første line er table info
Sub(s, o) o.Varenummer = Integer.Parse(s) End Sub, Sub(s, o) o.Varegruppenavn = s End Sub, Sub(s, o) o.Varenavn = s End Sub, Sub(s, o) o.Pris = s End Sub, Sub(s, o) o.Lagerstatus = s End Sub, Sub(s, o) o.Modelbetegnelse = s End Sub)
Men nu giver den fejl her Public Function ReadLine(Of T As {Class, New})(ParamArray asgn As Action(Of String, T)()) As T Dim raw As List(Of String) = ReadLine() If raw Is Nothing Then Return Nothing End If Dim o As New T() For i As Integer = 0 To asgn.Length - 1 asgn(i)(raw(i), o) <-- Indekset lå uden for området. Det må ikke være negativt og skal være mindre end størrelsen på samlingen. Parameternavn: index Next Return o End Function
der er følgen felter Varenummer,Varegruppenavn,Varenavn,Pris,Lagerstatus[JaLagerEllerLeveringstidenForVaren],Vaegt,Modelbetegnelse
som jeg har prøvet at sætte ind i data Public Class Data Public Property Varenummer As Integer Public Property Varegruppenavn As String Public Property Varenavn As String Public Property Pris As Double Public Property Lagerstatus As String Public Property Vaegt As Double Public Property Modelbetegnelse As String End Class
Opdage jeg kun have 6 så fik lige oprette den siste så vi kom op på 7.. men den bliver ved med at brokke sig
Public Function ReadLine(Of T As {Class, New})(ParamArray asgn As Action(Of String, T)()) As T Dim raw As List(Of String) = ReadLine() If raw Is Nothing Then Return Nothing End If Dim o As New T() For i As Integer = 0 To asgn.Length - 1 asgn(i)(raw(i), o) <-- Indekset lå uden for området. Det må ikke være negativt og skal være mindre end størrelsen på samlingen. Parameternavn: index Next Return o End Function
Jeg har prøve med en minder fil og det virker. dog et par fejl med pris men den kan smide alt data ud som den skal så måske er det den meget stor csv fil der er problem.
Et lille del af fil så du kan se Varenummer,Varegruppenavn,Varenavn,Pris,Lagerstatus[JaLagerEllerLeveringstidenForVaren],Vaegt,Modelbetegnelse 102052,"AMD processorer","AMD A serie A4-6320 3.8GHz Dual-Core FM2",329,JA,0.265,AD6320OKHLBOX 1011403,"AMD processorer","AMD A serie A4-5300 3.4GHz Dual-Core FM2",299,JA,0.266666,AD5300OKHJBOX 1011404,"AMD processorer","AMD A serie A6-5400K 3.6GHz Dual-Core FM2 ",435.11,NEJ,0.263333,AD540KOKHJBOX 1011410,"AMD processorer","AMD A serie A4-3300 2.5GHz Dual-Core FM1 ",84.93,NEJ,0,AD3300OJZ22HX
Public Function ReadLine() As List(Of String) Dim line As String = stream.ReadLine() If line Is Nothing Then Return Nothing End If
->
Public Function ReadLine() As List(Of String) Dim line As String = stream.ReadLine() If line Is Nothing Then Return Nothing End If Console.WriteLine(line)
og se hvad den sidste linie udskrevet inden fejl er.
(husk at slette den igen senere fordi der vil komme rigtigt mange linier ud)
er lidt usikker på hvor det er jeg skal rette fordi min ser ikke helt sådan ud.
Public Function ReadLine(Of T As {Class, New})(ParamArray asgn As Action(Of String, T)()) As T Dim raw As List(Of String) = ReadLine() If raw Is Nothing Then Return Nothing End If
Dim o As New T() For i As Integer = 0 To asgn.Length - 1 asgn(i)(raw(i), o) Next Return o End Function
Her er en ny version som er bedre til at haandtere " i vaerdier.
Public Class CSVReader Private stream As StreamReader Private fieldsep As Char Private strquote As Char Private esc As Char Public Sub New(stream As StreamReader, fieldsep As Char, strquote As Char, Optional esc As Char = ControlChars.NullChar) Me.stream = stream Me.fieldsep = fieldsep Me.strquote = strquote Me.esc = esc End Sub Public Function ReadLine() As List(Of String) Dim line As String = stream.ReadLine() If line Is Nothing Then Return Nothing End If Dim res As New List(Of String)() Dim inq As Boolean = False Dim skip As Boolean = False Dim tmp As New StringBuilder("") For i As Integer = 0 To line.Length - 1 Dim c As Char = line(i) If skip Then tmp.Append(c) skip = False ElseIf (c = fieldsep) AndAlso Not inq Then res.Add(tmp.ToString()) tmp = New StringBuilder("") ElseIf (c = esc) AndAlso (i < line.Length - 1) AndAlso (line(i + 1) = strquote) Then skip = True ElseIf (c = strquote) AndAlso ((tmp.Length = 0) OrElse inq) Then inq = Not inq Else tmp.Append(c) End If Next res.Add(tmp.ToString()) Return res End Function Public Function ReadLine(Of T As {Class, New})(ParamArray asgn As Action(Of String, T)()) As T Dim raw As List(Of String) = ReadLine() If raw Is Nothing Then Return Nothing End If Dim o As New T() For i As Integer = 0 To asgn.Length - 1 asgn(i)(raw(i), o) Next Return o End Function Public Function ReadAllLines(Of T As {Class, New})(ParamArray asgn As Action(Of String, T)()) As List(Of T) Dim res As New List(Of T)() Dim o As T = ReadLine(asgn) While o IsNot Nothing res.Add(o) o = ReadLine(asgn) End While Return res End Function Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, value As T) As T target = value Return value End Function End Class
Jeg vil bare lige sige jeg ikke har glemt dig men venter på at min udbyder vender tilbage fra sommerferie. samt at de får rette fejl på data..
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.