2017-12-18 274 views
2

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

任何帮助深表谢意。

哈日

+0

所以我从所有这一切得到的唯一的事情就是你要,'排序的所有数据基于日期?你的尝试是什么?一种选择,创建一个包含属性的类来放入数据,然后你可以按照你想要的方式对它进行排序...... – Codexer

+0

@Codexer,用我打算使用的函数编辑我的问题。我不能发布我在这里所做的任何事情,因为我的代码非常庞大 – Hari

+0

@Hari不要发布所有代码,只需发布​​您尝试对您拥有的数据进行排序的代码。这样看来你没有尝试任何东西,这不是真正的工作原理。最好展示你的试验和错误来帮助修复,而不是从头开始写。 –

回答

1

有许多方法排序各种类型的列表。
这里我考虑执行.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 
+0

Thaks。我正在尝试实现您建议的.OrderBy()方法。我能够对变量OrderedMyLines。但是,我无法将它写入csv文件。我曾尝试用foreach循环写入一个CSV文件,但无济于事。有没有什么办法可以循环使用变量并写入你可以建议的csv?这是为了验证我得到的排序值 – Hari

+0

@Hari你使用什么分隔符? – Jimi

+0

我正在使用逗号 – Hari

0

因为你的日期存储在“MM/DD/YYYY HH:MM”的格式,你必须给一个比较法的排序方法,在那里你分割你的日期值并重新排列其顺序,以便你得到的东西,更像是:“YYYY/MM/DD HH:MM”(最大的元素第一次)

因此,所有的一切:格式化您的日期和快乐:)