对于此分配,我被要求“将文件读入与文件中的列对应的并行字符串数组”。 文件中的列为:“P_CODE”“P_DESCRIPT”“P_INDATE”“P_QOH”“P_MIN”“P_PRICE”。 我的问题是“什么是并行阵列?”它看起来像什么我猜想我会怎么想,但我不确定我是否走在正确的轨道上。
========== project Inventory ==========
选择“读取”按钮将导致内容 要从项目的默认文件夹中读取的InventoryData.txt文件。 该文件包含列标题行。
将文件读入与文件中的列对应的并行字符串数组。读取文件后,将其关闭。显示 并行数组中文件的内容,包括列标题, 在使用Format()方法格式化的列表框中。左和右 根据约定对齐列的数据类型。暗示: 将列表框的Font属性设置为非比例空格字体 比如Courier。
在并行数组中写入文件的内容,包括 列标题,在您的文件中创建的名为InventoryDataOut.txt的文件 项目的默认文件夹。用管道(>)分隔列 符号。每个库存项目到文件的一行输出。
这是我到目前为止所做的。我刚刚开始,所以这不是功能代码。
Private Sub btnRead_Click(sender As Object, e As EventArgs) Handles btnRead.Click
Dim dirPath As String = "C:\Users\...\Inventory\"
Dim filePath As String = dirPath & "InventoryData.txt"
'Arrays
Dim P_CODE As String()
Dim P_DESCRIPT As String()
Dim P_INDATE As String()
Dim P_QOH As String()
Dim P_MIN As String()
Dim P_PRICE As String()
' Open file for reading
Dim textIn As New StreamReader(
New FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.None))
'Read in the lines of text into the String variables in the array;
Dim i As Integer = 0
Do While textIn.Peek <> -1
Dim row As String = textIn.ReadLine
Dim columns As String() = row.Split(CChar(" "))
P_CODE(i) = columns(i)
P_DESCRIPT(i) = columns(i)
P_INDATE(i) = columns(i)
P_QOH(i) = columns(i)
P_MIN(i) = columns(i)
P_PRICE(i) = columns(i)
i = i + 1
Loop
'=====================================
'- After reading the file, close it.
textIn.Close()
我收到以下警告和错误(对于每个数组):
警告1变量'P_CODE'在分配之前使用 值。可能会导致空引用异常 运行时。
答案 0 :(得分:1)
列是否为独立数组? :/
一行回答:You're doing it right!
StackOverflow的主要目的不是教授基本语言参考,而是帮助您克服特定问题使用适当的编码(同时请记住,如果答案不是答案,则答案不能成为答案提供回答OP问题的要素)
您说的错误与“什么是并行数组”这个问题并不真正相关。 “在为其分配值之前使用的变量”。当然 !您的数组 Null 。声明了变量但没有创建它的实例。并且数组在dotNet中是严格的(与JavaScript不同)
你真正的问题是什么? 它与“我应该如何将值分配给(并行)数组”更相关,并且可以像 那样重新表示“如何并行读取存储在文本文件中的字符串值数组并将它们写回来?“
家庭作业问题通常不允许使用替代方法(有时候这样的家庭作业问题被低估了)
不同的方法,如(使用带有linq的数据库):
使用File.ReadAllLines()
从一开始就知道行数......
声明您的数组顶级:您将无法在btnRead
之外访问它们。点击其他方式。
Private P_CODE As String()
Private P_DESCRIPT As String()
' ...
Private P_PRICE As String()
在btnRead中加载文件内容点击...
Dim AllLines As String() = File.ReadAllLines(filePath)
' ^^ the above will open and close the file XD
Dim Columns As String()
' Initialize your arrays...
ReDim(P_CODE, AllLines.Length - 1)
ReDim(P_DESCRIPT, AllLines.Length - 1)
' ...
ReDim(P_PRICE, AllLines.Length - 1)
' set each cell value.
For LineIndex As Int32 = 0 To P_CODE.Length - 1
Columns = AllLines(LineIndex).Split(" "c)
P_CODE(LineIndex) = Columns(0)
P_DESCRIPT(LineIndex) = Columns(1)
' ...
P_PRICE(LineIndex) = Columns(5)
' Hey ! Your File Datas are ordered horizontaly,
' so Columns must be indexed from 0 to 5
' instead of you "i" in your code in order
' to correctly feed your parallel arrays
Next
您的老师想强迫您使用StreamReader
打开文件,并教您不要忘记关闭文件...并使用StreamReader.ReadLine()
...好的......!
' ...
Dim LineIndex As Int32 = 0
Dim textIn As New StreamReader(filePath)
' ^^ why do you bother using a FileStream ?
Dim Row As String = textIn.ReadLine()
Dim Columns As String()
Do While row IsNot Nothing
Redim Preserve P_CODE(LineIndex)
Redim Preserve P_DESCRIPT(LineIndex)
' ...
Redim Preserve P_PRICE(LineIndex)
Columns = Row.Split(" "c)
P_CODE(LineIndex) = Columns(0)
P_DESCRIPT(LineIndex) = Columns(1)
' ...
P_PRICE(LineIndex) = Columns(5)
Row = textIn.ReadLine()
LineIndex = LineIndex + 1
Loop
textIn.Close() ' Voila !
' /!\ Add at least a Try Catch enclosing your Do/Loop if you're lazy.
告诉你的老师你会使用Using
,因为他强迫你使用StreamReader.Peek()
(必须是.Peek()吗?)
Using textIn As New StreamReader(filePath)
Dim LineIndex As Int32 = 0
Dim Columns As String()
Do While textIn.Peek() <> -1
Redim Preserve P_CODE(LineIndex)
Redim Preserve P_DESCRIPT(LineIndex)
' ...
Redim Preserve P_PRICE(LineIndex)
Columns = textIn.ReadLine().Split(" "c)
P_CODE(LineIndex) = Columns(0)
P_DESCRIPT(LineIndex) = Columns(1)
' ...
P_PRICE(LineIndex) = Columns(5)
LineIndex = LineIndex + 1
Loop
End Using ' StreamReader closed ! XD
FileStream
!如果我知道文件中每个数据块的大小,我会使用固定大小的结构。 FileStream最适合在操作大型数据缓冲区时使用,因为它可以通过适当的异步检查直接在内存中工作。
只是读行?不!对于此部分,read the documentation。
Dim Row As String
MyListBox.Items.Clear()
For LineIndex As Int32 = 0 To P_CODE.Length - 1
Row = String.Format("{0, -12}{1,-16}{2,10}{3,10}{4,8}{5,10}", _
P_CODE(LineIndex), _
P_DESCRIPT(LineIndex), _
P_INDATE(LineIndex), _
P_QOH(LineIndex), _
P_MIN(LineIndex), _
P_PRICE(LineIndex))
MyListBox.Items.Add(Row)
Next
将文件写入InventoryDataOut.txt ..
Dim Separator As String = "|"
Dim FileContent As New StringBuilder() ' System.Text
' Prepare File content...
If P_CODE.Length > 0 Then
For LineIndex As Int32 = 0 To P_CODE.Length - 2 ' Note the -2
FileContent.AppendLine(String.Format("{0}{6}{1}{6}{2}{6}{3}{6}{4}{6}{5}", _
P_CODE(LineIndex), _
P_DESCRIPT(LineIndex), _
P_INDATE(LineIndex), _
P_QOH(LineIndex), _
P_MIN(LineIndex), _
P_PRICE(LineIndex), _
Separator)))
Next
FileContent.Append(String.Format("{0}{6}{1}{6}{2}{6}{3}{6}{4}{6}{5}", _
P_CODE(P_CODE.Length - 1), _
P_DESCRIPT(P_CODE.Length - 1), _
P_INDATE(P_CODE.Length - 1), _
P_QOH(P_CODE.Length - 1), _
P_MIN(P_CODE.Length - 1), _
P_PRICE(P_CODE.Length - 1), _
Separator)))
' This ensures we don't add unnecessary line at the end of the file
' which would make your application explode !
' best move is to check for null entries upon file parsing.
' (Again : File.ReadAllLines() + RemoveEmptyString parameter to keep it simple)
End If
' Create your file using the stream object
' you're forced to use by your teacher,
' then dump the the content of your StringBuilder inside like
MyDummyStream.Write(FileContent.ToString())
' And close you dummy stream or use Using XD
您的老师是否有一堆类似CSV的文件需要从空间到管道的分隔符转换?
似乎他只是懒得编写代码来分派几个并行数组中的每一列用于显示或其他目的。或者,为什么在加载文件内容时使用空格作为分隔符,而使用管道来代替它们? 如果是一个错字,就不要费心阅读了。否则,您的老师只是要求您创建一个将空间分隔符转换为管道的小程序...(同时为您提供学习操作(并行)数组,流I / O和String.Format)的任务