数据排序
问题描述:
我有一个类似的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”(最大的元素第一次)
因此,所有的一切:格式化您的日期和快乐:)
所以我从所有这一切得到的唯一的事情就是你要,'排序的所有数据基于日期?你的尝试是什么?一种选择,创建一个包含属性的类来放入数据,然后你可以按照你想要的方式对它进行排序...... – Codexer
@Codexer,用我打算使用的函数编辑我的问题。我不能发布我在这里所做的任何事情,因为我的代码非常庞大 – Hari
@Hari不要发布所有代码,只需发布您尝试对您拥有的数据进行排序的代码。这样看来你没有尝试任何东西,这不是真正的工作原理。最好展示你的试验和错误来帮助修复,而不是从头开始写。 –