/ Forside/ Teknologi / Udvikling / VB.Net / Spørgsmål
Login
Glemt dit kodeord?
Brugernavn 

Kodeord  


Reklame
Top 10 brugere
VB.Net
#NavnPoint
smorch 160
csvendsen 100
emesen 100
Nick15 98
Opdel "" afgrænset tekst
Fra : berpox
Vist : 872 gange
160 point
Dato : 30-05-08 15:22

Hej eksperter - her er jeg virkelig rendt mod en mur!
Men mon ikke der er nogle kloge hoveder der kan hjælpe?

Jeg vil indlæse en tekstfil, hvor felterne er afgrænset af "" og adskilt af komma (,).
Data skal lægges i et lille array.
Tekstfilen er formateret således:
Kode
"ITEM00115","Cykelhjelm, Large","L","DKK","499,95","",""
"ITEM00116","Cykelhjelm, Medium","M","DKK","359,95","",""
"ITEM00117","Cykelhjelm, Small","S","DKK","229,95","",""

- bemærk, at alle linier er efterfulgt af 2 tomme felter beregnet for senere udnyttelse....

Koden ser i sin grundsubstans således ud.....(uden alt løkkegejlet, så kun første linie indlæses):

Kode
Public Sub OpenMyText()
Dim ItemLine() as string
Dim iRead as System.IO.TextReader
iRead = IO.File.OpenText(myFilenamestring)

Dim SplitMyLine() as String

SplitMyLine = Split(iRead.Readline(), >>textdelimiter<<)

End Sub


Ja, det burde være let. Det var det også i VB6.
Men med .NET er det åbenbart ikke tilladt, at bruge en feltafgrænser (qualifier), og slet ikke " ...
Kun adskilleren (delimiter) kan bruges. Og angivelsen af en delimiter omsluttes af... ja, netop: citationstegn (double quotation mark) - og jeg kan naturligvis ikke bruge komma som adskiller, netop da komma kan forekomme mellem to citationstegn, både i varebetegnelse-feltet, og i pris-feltet...

Så hva' dælen do I do .... tekstfilformatet er bundet.

mvh berpox.

 
 
Kommentar
Fra : smorch


Dato : 30-05-08 16:49

Behandl det som en tekststreng med uønskede elementer: Fjern de dobbelte citationsstegn og split derefter de enkelte linier.

dim tekstStreng as string = replace(iRead.Readline(), chr(34),"")

dim linieARR as array= split(tekstStreng,",")



Kommentar
Fra : berpox


Dato : 08-06-08 10:29

Hej Smorch...

Jep - det var da en idé - men den angivne metode vil også splitte min "felter" de forkerte steder, idet der således splittes ved komma.

Og det er ikke meningen. "Cykelhjelm, Large" skal behandles som ét felt...ikke som "Cykelhjelm" og "Large". Det samme gælder beløbsfeltet, der splittes i "499" og "95"

Kommentar
Fra : smorch


Dato : 08-06-08 11:33
Accepteret svar
Fra : smorch

Modtaget 160 point
Dato : 08-06-08 12:41

Nu har jeg leget lidt med ovennævnte link og rettet til og fået det til at fungere.

Mvh

sMorch

default2.aspx:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default2.aspx.vb" Inherits="Default2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblsplittext" runat="server" Text="Label"></asp:Label>
</div>
</form>
</body>
</html>


default2.aspx.vb:

Imports System
Imports System.IO

Partial Class Default2
Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'OpenMyText()
ReadFromFile("c:\stien\til\teksfilen\test.txt") 'RET stien og filnavnet
End Sub

Public Sub ReadFromFile(ByVal strPath As String)
Dim FileHolder As FileInfo = New FileInfo(strPath)
Dim ReadFile As StreamReader = FileHolder.OpenText()
Dim strLine As String

Do
strLine = ReadFile.ReadLine
If Not strLine = "" Then
ParseCSV(strLine)
'MsgBox("ENDLINE")
lblsplittext.Text &= "<br>"
Else
ReadFile.Close()
ReadFile = Nothing
'lblsplittext.Text &= "hmmmmm"
End If
Loop Until ReadFile Is Nothing

'Return True
End Sub


Public Sub ParseCSV(ByVal CSVstr As String)

Dim startPos As Integer
Dim endPos As Integer
Dim currPos As Integer
Dim tempstr As String
Dim commaPos As Integer
Dim quotePos As Integer
Dim strLen As Integer
Dim charLen As Integer

startPos = 1
currPos = 1

strLen = Len(CSVstr)


Do While strLen <> 0
CSVstr = Replace(CSVstr, Chr(34) & Chr(34), "'")
commaPos = InStr(currPos, CSVstr, ",")
quotePos = InStr(currPos, CSVstr, Chr(34))
'last data
If commaPos = 0 Then
If quotePos = 0 Then
If Not currPos > endPos Then
endPos = strLen + 1
charLen = endPos - currPos
tempstr = Mid(CSVstr, currPos, charLen)
'If Not tempstr = "" Then
lblsplittext.Text &= ReadChars(tempstr, 1, charLen, charLen) & " " 'her er sat et mellemrum i enden for sys skyld - ditto i nedenstående ens linier
'End If
End If
Else
currPos = quotePos
endPos = InStr(currPos + 1, CSVstr, Chr(34))
charLen = endPos - currPos
tempstr = Mid(CSVstr, currPos + 1, charLen - 1)

'If Not tempstr = "" Then
lblsplittext.Text &= ReadChars(tempstr, 1, charLen, charLen) & " "
'End If
End If
Exit Do
End If
'no " in line
If quotePos = 0 Then

endPos = commaPos
charLen = endPos - currPos
tempstr = Mid(CSVstr, currPos, charLen)
'If Not tempstr = "" Then
lblsplittext.Text &= ReadChars(tempstr, 1, charLen, charLen) & " "
'End If


ElseIf (quotePos <> 0) Then
'" in line
If commaPos < quotePos Then
endPos = commaPos
charLen = endPos - currPos
tempstr = Mid(CSVstr, currPos, charLen)
'If Not tempstr = "" Then
lblsplittext.Text &= ReadChars(tempstr, 1, charLen, charLen) & " "
'End If
Else
currPos = quotePos
endPos = InStr(currPos + 1, CSVstr, Chr(34))
charLen = endPos - currPos
tempstr = Mid(CSVstr, currPos + 1, charLen - 1)

'If Not tempstr = "" Then
lblsplittext.Text &= ReadChars(tempstr, 1, charLen, charLen) & " "
'End If
endPos = endPos + 1
End If
End If
currPos = endPos + 1
Loop



End Sub

Public Function ReadChars(ByVal str As String, ByVal StartPos As Integer, ByVal EndPos As Integer, ByVal strLen As Integer) As String

Dim strArray As [String] = str
Dim b(strLen) As Char
Dim sr As New StringReader(strArray)

sr.Read(b, 0, EndPos)
Return b
'lblsplittext.Text &= b ' & " "
'MsgBox(b)

sr.Close()
End Function



End Class


test.txt:

"ITEM00115","Cykelhjelm, Large","L","DKK","499,95","",""
"ITEM00116","Cykelhjelm, Medium","M","DKK","359,95","",""
"ITEM00117","Cykelhjelm, Small","S","DKK","229,95","",""

Godkendelse af svar
Fra : berpox


Dato : 18-06-08 00:27

Hej smorch - efter lidt puslen med koden, fik jeg det til at virke

Super godt - 1000 tak for hjælpen!!!


Kommentar
Fra : smorch


Dato : 18-06-08 06:49

Sæl

Du har følgende muligheder
Eftersom du ikke er logget ind i systemet, kan du ikke skrive et indlæg til dette spørgsmål.

Hvis du ikke allerede er registreret, kan du gratis blive medlem, ved at trykke på "Bliv medlem" ude i menuen.
Søg
Reklame
Statistik
Spørgsmål : 176405
Tips : 31892
Nyheder : 719565
Indlæg : 6401425
Brugere : 218693

Månedens bedste
Årets bedste
Sidste års bedste