2012-11-20 14 views
6

quello che ho:Rompere una stringa in array

Quindi c'è questo grande progetto su cui sto lavorando per la scuola, e ho tutto lavorando ad eccezione di un piccolo ma vitale pezzo. Il programma su cui sto lavorando deve convertire la valuta e prendere le tariffe da un file txt. Il file è simile al seguente:

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

c'è una rottura scheda tra il nome e il valore e l'interruzione del collegamento fra il valore e il nome della valuta successiva. I valori hanno un punto fluttuante e non hanno una lunghezza fissa.

Quello che serve:

ho bisogno di rompere questa stringa in due matrici, currencyNames() e currencyValues(), o in un array a due-dimensionale currency().

Che cosa posso fare io:

posso caricarlo da un file in una stringa con

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

E sono stato in grado di rompere in un array con un semplice ciclo

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

ma solo quando c'è uno spazio che separa i nomi e i valori all'interno del file.

+0

ReadAllLines provare() al posto di ReadAllText() –

risposta

3

Quello che stai cercando sono il VB Constants, un insieme di stringhe speciali per i caratteri speciali come scheda e nuova linea - non c'è una lista al link, ma la vostra in particolare è vbTab e vbCrLf. Non dovresti aver bisogno di importare nulla - sono integrati in VB.

Per utilizzarli, che ci si cambia in qualcosa di simile a:

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

E poi:

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

Una combinazione di ReadLine() e String.Split() dovrebbe aiutare a risolvere il problema.

Se si dovesse un leggere ogni riga voce per riga, usando ReadLine(), si potrebbe quindi dividere sullo spazio come questo:

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

e

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

per ottenere il relativo valori dalla tua coppia.

3

L'idea di base è qualcosa di simile:

  • leggere ogni riga del file
  • Spalato la linea sulla barra spaziatrice
  • Conservare il paese come la prima parte della divisione
  • Memorizza l'importo come seconda porzione, formattato come numero intero
  • Proietta paese e importo in matrici separate

Ecco una semplice implementazione 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 

Ho anche usato un piccolo metodo di estensione per avvolgere 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, ma non è chiaro da la fonte se dividi in TAB o SPAZIO. VbTab non dovrebbe essere una soluzione migliore? '.Split (New String() {vbTab},' – igrimpe

+0

@igrimpe Sono d'accordo, non è chiaro al 100% Se dovrebbe essere tab è una modifica abbastanza semplice. Er per chiarire che non è chiaro nei dati di esempio se si tratta di uno spazio o una scheda al 100%. Sono andato con lo spazio, ma è un buon punto. – asawyer

Problemi correlati