数据排序

我有一个类似的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

回到顶部