2017-12-18 268 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」(最大的元素第一次)

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