我认为这很简单,但出于某种原因它不会来找我......
这是我目前的代码
Dim fileReader As New StreamReader(FOfileToProcess)
Dim sLine As String = ""
Dim fileText As New ArrayList()
Do Until fileReader.EndOfStream()
sLine = fileReader.ReadLine()
If Not sLine Is Nothing Then fileText.Add(sLine)
Loop
fileReader.Close()
fileText.Sort(20, 2, Nothing) 'My intention is to sort by the values at zero-based 20 for 2 characters
fileText.Sort(63, 9, Nothing) '... and likewise at zero-based 63 for 9 characters
Dim saText() As String = DirectCast(fileText.ToArray(GetType(String)), String())
File.WriteAllLines(FOfileToProcess + "_sorted", saText)
它有效,但写出的'_sorted'文件未正确排序。这只是纠正我的排序字段的问题吗?原始排序是一个2字段排序,主要是第63列,第二列是第20列,但由于只有一组参数,我认为第一个是第二个并以主要结束。
建议?
TIA!
答案 0 :(得分:0)
ArrayList.Sort(Int32, Int32, IComparer)
不会通过子字符串对字符串进行排序。您可以指定要排序的范围,因此字符串21到23和64到73。
您希望按每个字符串中的子字符串进行排序。我可以使用LINQ和ReadLines
/ WriteAllLines
?
Dim lines = From line In System.IO.File.ReadLines(FOfileToProcess)
Where line.Length >= 73
Let col1 = line.Substring(20, 2)
Let col2 = line.Substring(63, 9)
Order By col1 Ascending, col2 Ascending
Select line
System.IO.File.WriteAllLines(FOfileToProcess + "_sorted", lines)
答案 1 :(得分:0)
首先,请勿使用ArrayList
,因为它不允许您指定商品的类型。相反,请使用List(Of T)
。
Dim fileText As New List(Of String)
其次,Sort
方法的索引与行号有关,而与字符串中的位置无关(ArrayList
不知道您正在插入字符串)。
Dim fileTextSorted = fileText _
.OrderBy(Function(s) s.Substring(20, 2)) _
.ThenBy(Function(s) s.Substring(63, 29))
如果文件包含的行短于子串或空行的所需位置(例如文件末端的一行空行),则使用VB Mid
函数优先于{{1}这可能会抛出异常。或者,您可以首先应用Substring
条件来放弃此类行:Where
或者在阅读文件时不要将这些行添加到列表中。