Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 基于列日期对数据进行排序_Vb.net_Csv - Fatal编程技术网

Vb.net 基于列日期对数据进行排序

Vb.net 基于列日期对数据进行排序,vb.net,csv,Vb.net,Csv,我有一个类似以下内容的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

我有一个类似以下内容的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轴上有下、上和实际列,在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
非常感谢您的帮助


Hari

因为您的日期是以“MM/dd/yyyy HH:MM”格式存储的,所以您必须为排序方法提供一个比较方法,在排序方法中,您可以拆分日期值并重新排序它们的顺序,以便获得更像“yyy/MM/dd HH:MM”的内容(首先是最大元素)


因此,总而言之:重新编排日期并快乐起来:)

有许多方法可以对各种类型的列表进行排序。
在这里,我考虑了<代码> .OrthBee()/<代码>和<代码> .SoTo()/<代码>

用作从源文件读取的数据容器的类

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))

另一个使用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

因此,我从所有这些中得到的唯一一件事是,您想,
根据日期对所有数据进行排序
?你的企图是什么?一个选项是,创建一个具有属性的类来将数据放入其中,然后您可以按任何方式对其进行排序…@Codexer,用我计划使用的函数编辑了我的问题。我不能在这里发布我所做的任何事情,因为我的代码是huge@Hari不要发布所有代码,只发布您试图对数据进行排序的代码。这样看来,你似乎什么都没试过,但事实并非如此。最好显示您的尝试和错误以帮助修复,而不是从头开始编写。将数据读入类似于列表(T)的内容,对其进行排序,如果您认为有必要,将其写出来。类似CSVHelper的东西将使读取和写入CSV文件变得非常简单。请务必对数据使用
DateTime
var,以便它像dateThaks一样进行解释。我正在尝试实现您建议的.OrderBy()方法。我能够找到变量OrderedMyLines。但是,我无法将其写入csv文件。我曾尝试使用foreach循环写入csv文件,但没有成功。是否有任何方法可以循环使用变量并写入csv,您可以提出建议?这是为了验证我是否得到了排序value@Hari你在用什么分离器?我在用comma@Hari我编辑了一点代码,因为我认为显式实现Using块更好。@Hari很高兴它有帮助。也许可以尝试两种排序方法,看看哪种性能更好。考虑到整个过程,我认为Sort()方法更快。但是,这要视情况而定。如果您感兴趣,还可以在异步方法中轻松转换它。
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