2012-03-19 4 views
0

У меня возникли проблемы с поворотом набора данных из текстового файла в массивы, в основном, то, что я имею в текстовом файле:Как вводить данные в массив из текстового файла, разделенного vbTab?

Eddy vbtab 20 
Andy vbtab 30 
James vbtab 20 

и т.д ..

Я хочу, чтобы настроить имена как массив имен и числа в виде массива чисел.

Теперь то, что я сделал это

strFilename = "CustomerPrices.txt" 
If File.Exists(strFilename) Then 
    Dim srReader As New StreamReader(strFilename) 
    intRecords = srReader.ReadLine() 
    intRows = intRecords  

    For i = 0 To intRows - 1 
    intLastBlank = strInput.IndexOf(vbTab) 
    strName(intPrices) = strInput.Substring(0, intLastBlank) 

    dblPrices(intPrices) = Double.Parse(strInput.Substring(intLastBlank + 1)) 

Но когда я отладки я получаю проблему «Ссылка на объект не указывает на экземпляр объекта»

Может кто-нибудь дать мне некоторые рекомендации?

Благодаря

+0

Joel дал вам решение ниже. Ответ на ваш вопрос о проблеме отладки заключается в том, что вы используете 'strInput', не объявляя его или не присваивая ему что-либо в первую очередь. (Вы читаете строку текста в 'intRecords', которую вы никогда не используете, а затем используйте' strInput', который не существует. Вы также ссылаетесь на 'strName',' intPrices' и 'dblPrices', которые не объявлены в любом месте вашего кода.) –

+0

@Kenwhite привет, спасибо, что указали это, но я объявил все необходимые объекты, я просто не показывал его в сообщении. При отладке этого кода я получил NullReferenceException, который был необработанным - «Ссылка на объект не установлена ​​в экземпляр объекта» – Eddy

+0

В вашем коде показано, что они используются без назначения. Даже если вы объявили их в другом месте и не отображали их, им все равно нужно присвоить им значения, прежде чем их можно будет использовать - вот почему вы получаете «NullReferenceException». (И вы всегда должны публиковать ** полный ** код, когда у вас есть проблема с кодом, BTW. Если вы этого не сделаете, ваши шансы получить правильный ответ намного ниже.) –

ответ

3

Отдельные массивы, вероятно, плохая идея здесь. Они группируют ваши данные по полям, когда почти всегда лучше группировать данные по записям. Вместо этого вы хотите создать единую коллекцию, заполненную классами определенного типа. Перейти на что-то вроде этого:

Public Class CustomerPrice 
    Public Property Name As String 
    Public Property Price As Decimal 
End Class 

Public Function ReadCustomerPrices(ByVal fileName As String) As List(Of CustomerPrice) 
    Dim result As New List(Of CustomerPrice)() 
    Using srReader As New StreamReader(fileName) 
     Dim line As String 
     While (line = srReader.ReadLine()) <> Nothing 
      Dim data() As String = line.Split(vbTab) 
      result.Add(new CustomerPrice() From {Name = data(0), Price = Decimal.Parse(data(1))}) 
     End While 
    End Using 
    Return result 
End Function 

Некоторые другие вещи, стоит отметить в этом коде:

  • Применение метода блок будет гарантировать, что файл закрыт, даже если исключение
  • Он почти никогда для проверки File.Exists(). Это расточительный код, потому что вы все еще должны иметь возможность обрабатывать исключения файлов io.
  • При работе с деньгами вы почти всегда хотите использовать десятичный тип, а не двойной
  • Для этого кода требуется Visual Studio 2010/.Net 4, и он был введен непосредственно в окно ответа и, вероятно, содержит ошибку, или даже базовую синтаксическую ошибку.
+0

Спасибо за ваш быстрый ответ , Я это попробую! – Eddy

+0

Дело в моем последнем предложении: я просто забыл цикл while –

Смежные вопросы