2012-11-20 10 views
6

Was ich habe. Das Programm an dem ich arbeite muss Währung, konvertieren und die Preise von einer txt-Datei nehmen. Die Datei sieht wie folgt aus:einen String in Arrays Pause

USD 1,2694 
JPY 100,44 
BGN 1,955 
CZK 25,396 
DKK 7,45792 
... 

Es gibt eine Registerkarte Pause zwischen dem Namen und dem Wert und einen Zeilenumbruch zwischen dem Wert und dem nächsten Währung Namen. Werte haben eine Gleitkommazahl, und keine feste Länge haben.

Was ich brauche:

Ich brauche diese Zeichenfolge in zwei Reihen zu brechen, currencyNames() und currencyValues() oder in einen zweidimensionalen Array currency().

Was kann ich selbst tun:

ich es aus einer Datei in einen String laden kann mit

fileReader = My.Computer.FileSystem.ReadAllText("rates.txt") 

Und ich konnte es in ein Array mit einer einfachen Schleife brechen

Do While i < 32 
    dummyArray = Split(fileReader, " ") 
    i += 1 
Loop 

aber nur, wenn zwischen den Namen und Werten in der Datei ein Leerzeichen steht.

+0

Try ReadAllLines() anstelle von ReadAllText() –

Antwort

3

Was Sie suchen sind die VB Constants, eine Reihe von speziellen Strings für Sonderzeichen wie Tab und neue Zeile zu wickeln - es gibt eine Liste auf dem Link, aber Ihre insbesondere sind vbTab und vbCrLf. Sie sollten nichts importieren müssen - sie sind in VB integriert.

dummyArray = Split(fileReader, vbCrLf) ' to split on lines 

Und dann:

, sie zu benutzen, würden Sie es so etwas wie ändern

For Each s as String In dummyArray 
    otherArray = Split(s, vbTab) ' to split on tab characters 
1

Eine Kombination von Readline() und String.Split() sollten Sie Ihr Problem lösen helfen.

Wenn Sie zu einer lesen jedes Element Zeile für Zeile waren, unter Verwendung von Readline(), könnten Sie spalten dann auf dem Platz wie folgt aus:

ReadLine().Split(' ').First(); 

und

ReadLine().Split(' ').Last(); 

die relevant zu bekommen Werte aus dem Paar.

3

Die Grundidee ist so etwas wie dieses:

  • jede Zeile Lesen aus der Datei
  • Split die Linie auf der Leertaste
  • Shop das Land wie der erste Abschnitt des geteilten
  • Speichern Sie den Betrag als zweiten Teil, formatiert als Ganzzahl
  • Projizieren Sie das Land und die Menge in separate Arrays

Hier ist eine einfache Implementierung in Vb.Net

Sub Main 

    dim input = System.IO.File.ReadAllLines("c:\yourdata.txt") 

    dim projection = from line in input 
        let split = line.Split(new string(){" "},StringSplitOptions.RemoveEmptyEntries) 
        select Country = split.First(), Amount = split.Last().Replace(",","").Parse() 

    dim countries = projection.Select(function(p) p.Country).ToArray() 
    dim amounts = projection.Select(function(p) p.Amount).ToArray() 

End Sub 

habe ich auch ein Verfahren kleine Erweiterung Integer.TryParse

namespace ExtensionMethods 
    public module Extensions 
     <Extension()>_ 
     public function Parse(byval value as string) as integer 
      dim i = 0 
      if integer.TryParse(value,out i) then 
       return i 
      end if 
      return 0 
     end function 
    end module 
end namespace 
+1

+1, aber es ist nicht klar, die Quelle, wenn Sie auf TAB oder SPACE teilen. Sollte nicht VbTab eine bessere Lösung sein? '.Split (New String() {vbTab},' – igrimpe

+0

@igrimpe Ich stimme zu, es ist nicht 100% klar. Wenn es Tab sein sollte, ist es eine einfache genug Änderung. Zur Klärung ist es in den Beispieldaten nicht klar, ob es ein Leerzeichen ist oder ein Tab 100% .Ich ging mit dem Raum.Es ist ein guter Punkt. – asawyer