数据排序
我有一个类似的csv文件:数据排序
Test Case Lower Upper Actual Date Measure 2 8 3 4/14/2016 9:18
Measure 2 8 3 4/14/2016 11:16
Measure 2 8 5 4/12/2016 19:19
Measure 2 8 7 4/22/2016 10:36
Measure 2 8 6 4/22/2016 12:39
我的目标是从可以从上面的CSV数据绘制折线图,实际的CSV文件包含几千线。我的图表将在x轴上显示Lower,Upper和Actual列,并在y轴中显示日期(基于星期编号)。
我想根据日期绘制图表(从最旧到最新)。如果您注意到“日期”列,这些值会被搞乱,而不是按照日期的升序排列。
我的计划是创建另一个csv文件(Sorted.csv)并将数据按升序排列并从那里执行我的海图绘制。我坚持不懈,因为我无法找到一种方法来根据日期对所有数据进行排序。如果我能够创建Sorted.csv,我可以继续我的目标。这是我的示例功能:
Private Function sortCSV() For Each rawRows As String In File.ReadLines("C:\sampleVBPrograms\SimplePlot\SomeFile.csv")
'I wanted to sort each line and place into a new csv "Sorted.csv" here
'Just stuck in the way to sort, writing into Sorted.csv, I can do
Next
End Function
任何帮助深表谢意。
哈日
回答:
有许多方法排序各种类型的列表。
这里我考虑执行.OrderBy()
和.Sort()
。
一个用作从源文件读取数据的容器的类。
Public Class Lines Public Property TestCase As String
Public Property Lower As Single
Public Property Upper As Single
Public Property Actual As Single
Public Property ItemDate As DateTime
End Class
创建一个列表(行),并与您的数据填充它:
编辑:设置分隔符为逗号(CHR(44))。
Dim MyLines As New List(Of Lines)() Dim _FirstLine() As String
Dim _line() As String
Using _reader As TextReader = New StreamReader("C:\sampleVBPrograms\SimplePlot\SomeFile.csv")
'FirstLine keeps the Header of the following data
_FirstLine = _reader.ReadLine().Split(Chr(44))
'Read the file and split using Comma as delimiter
While (_reader.Peek() >= 0)
_line = _reader.ReadLine().Split(Chr(44))
'The Date Field is parsed using the InvariatCulture Comparer
'See if this setting suits your needs
MyLines.Add(New Lines With {.TestCase = _line(0),
.Lower = CType(_line(1), Single),
.Upper = CType(_line(2), Single),
.Actual = CType(_line(3), Single),
.ItemDate = Date.Parse(_line(4), CultureInfo.InvariantCulture)})
End While
End Using
'Order the list using a verbose .OrderBy()
Dim OrderedMyLines As IOrderedEnumerable(Of Lines) =
MyLines.OrderBy(Function(t As Lines) t.ItemDate, Comparer(Of DateTime).Default)
另一种使用Sort()的方法。
我为此使用自定义比较器。由于日期进行比较,您可能需要根据您的文化风格进行调整。
Public Class LinesComparer Implements IComparer(Of Lines)
'Implements a Compare method for IComparer.
'See that the date evaluation differs from the one used in .OrderBy()
Public Function Compare(x As Lines, y As Lines) As Integer Implements IComparer(Of Lines).Compare
Return x.ItemDate.CompareTo(y.ItemDate)
End Function
End Class
'Sort the list using the custom Comparer
Dim LinesComp As LinesComparer = New LinesComparer()
MyLines.Sort(0, MyLines.Count, LinesComp)
编辑:
写入文件任意的有序列表:
Using _writer As TextWriter = New StreamWriter("C:\sampleVBPrograms\SimplePlot\sorted.csv") _writer.WriteLine(String.Join(Chr(44), _FirstLine, 0, _FirstLine.Length)
For Each Line As Lines In OrderedMyLines
_writer.WriteLine(Line.TestCase + Chr(44) +
Line.Lower.ToString + Chr(44) +
Line.Upper.ToString + Chr(44) +
Line.Actual.ToString + Chr(44) +
Line.ItemDate.ToString)
Next
End Using
回答:
因为你的日期存储在“MM/DD/YYYY HH:MM”的格式,你必须给一个比较法的排序方法,在那里你分割你的日期值并重新排列其顺序,以便你得到的东西,更像是:“YYYY/MM/DD HH:MM”(最大的元素第一次)
因此,所有的一切:格式化您的日期和快乐:)
以上是 数据排序 的全部内容, 来源链接: utcz.com/qa/261455.html