【问题标题】:Re-writing a python program into VB, how to sort CSV?将python程序重写为VB,如何对CSV进行排序?
【发布时间】:2014-03-17 11:53:41
【问题描述】:

大约一年前,我用 python 编写了一个小程序,它基本上可以自动化我的部分工作(在你们的帮助下!)但是,我遇到了一个问题。随着我不断使程序变得越来越好,我意识到 Python 不想与 excel 配合得很好,而且(不用让你厌烦细节就足以说明 xlutils 不会复制公式)我需要有更多的权限来访问我的 excel意图。

所以我开始使用 VB(2010 Express,如果有帮助的话)。我一生中唯一上过的编程课程就是它,而且它非常简单,所以我决定回到它为此。不幸的是,我已经忘记了很多我学到的东西,而且我们从来没有真正从兔子洞里走这么远。所以,长话短说,我想:

1) 从结构如下的 .csv 读取数据:

    41,332.568825,22.221759,-0.489714,eow
    42,347.142926,-2.488763,-0.19358,eow
    46,414.9969,19.932693,1.306851,r
    47,450.626074,21.878299,1.841957,r
    48,468.909171,21.362568,1.741944,r
    49,506.227269,15.441723,1.40972,r
    50,566.199838,17.656284,1.719818,r
    51,359.069935,-11.773073,2.443772,l
    52,396.321911,-8.711589,1.83507,l
    53,423.766684,-4.238343,1.85591,l

2) 按第 5 列的字母顺序对数据进行排序
3)然后只选择第 5 列中带有“l”的那些,按第 2 列(升序)对它们进行数字排序,并将它们复制到一个名为线圈.csv
4)然后只选择第5列中具有“r”的那些,按第2列(降序)对它们进行数字排序并将它们复制到相同的文件coil.csv(显然附加在其他文件之后)

在所有的喧嚣之后,我想出去:

    51,359.069935,-11.773073,2.443772,l
    52,396.321911,-8.711589,1.83507,l
    53,423.766684,-4.238343,1.85591,l
    50,566.199838,17.656284,1.719818,r
    49,506.227269,15.441723,1.40972,r
    48,468.909171,21.362568,1.741944,r
    47,450.626074,21.878299,1.841957,r
    46,414.9969,19.932693,1.306851,r

我意识到这可能是一个相当复杂的问题,如果没有人愿意处理所有这些问题,我当然理解,哈哈。无论如何,一些完整的代码、sn-ps、想法甚至相关链接将不胜感激。我一直在并且仍在谷歌搜索,但要找到与此相关的可靠可靠信息比预期的要难。

附:这是我正在谈论的一段python代码(尽管它为我并不真正需要的左右创建了两个单独的文件)-如果它对您有帮助的话。

msgbox(msg="Please locate your survey file in the next window.")
mainfile = fileopenbox(title="Open survey file")
toponame = boolbox(msg="What is the name of the shots I should use for topography? Note: TOPO is used automatically",choices=("Left","Right"))

fieldnames = ["A","B","C","D","E"]
surveyfile = open(mainfile, "r")
left_file = open("left.csv",'wb')
right_file = open("right.csv",'wb')
coil_file = open("coil1.csv","wb")


reader = csv.DictReader(surveyfile, fieldnames=fieldnames, delimiter=",")
left_writer = csv.DictWriter(left_file, fieldnames + ["F"], delimiter=",")
sortedlefts = sorted(reader,key=lambda x:float(x["B"]))

surveyfile.seek(0,0)

right_writer = csv.DictWriter(right_file, fieldnames + ["F"], delimiter=",")
sortedrights = sorted(reader,key=lambda x:float(x["B"]), reverse=True)

coil_writer = csv.DictWriter(coil_file, fieldnames, delimiter=",",extrasaction='ignore')

for row in sortedlefts:
    if row["E"] == "l" or row["E"] == "cl+l":
        row['F'] = '%s,%s' % (row['B'], row['D'])
    left_writer.writerow(row)
    coil_writer.writerow(row)   

for row in sortedrights:
    if row["E"] == "r":
    row['F'] = '%s,%s' % (row['B'], row['D'])
        right_writer.writerow(row)
    coil_writer.writerow(row)

【问题讨论】:

  • 是的,它们是拼写错误。此外,这只是程序的一部分。宏对我帮助不大。
  • 对不起,我没有关注你。如果有什么我可以做的更清楚的,请告诉我。
  • 快速版不支持宏。

标签: python vb.net excel sorting csv


【解决方案1】:

你有一个选择是从一个类开始来保存字段。这允许您覆盖 ToString 方法以方便输出。然后,读取每一行并将值分配给类列表是一件相当简单的事情。在您的情况下,您需要额外的步骤来制作 2 个列表,以降序排列并组合它们:

Class Fields

    Property A As Double = 0
    Property B As Double = 0
    Property C As Double = 0
    Property D As Double = 0
    Property E As String = ""
    Public Overrides Function ToString() As String
        Return Join({A.ToString, B.ToString, C.ToString, D.ToString, E}, ",")
    End Function
End Class

Function SortedFields(filename As String) As List(Of Fields)
    SortedFields = New List(Of Fields)
    Dim test As New List(Of Fields)
    Dim sr As New IO.StreamReader(filename)
    Using sr As New IO.StreamReader(filename)
        Do Until sr.EndOfStream
            Dim fieldarray() As String = sr.ReadLine.Split(","c)
            If fieldarray.Length = 5 AndAlso Not fieldarray(4)(0) = "e"c Then
                If fieldarray(4) = "r" Then
                    test.Add(New Fields With {.A = Double.Parse(fieldarray(0)), .B = Double.Parse(fieldarray(1)), .C = Double.Parse(fieldarray(2)), .D = Double.Parse(fieldarray(3)), .E = fieldarray(4)})
                Else
                    SortedFields.Add(New Fields With {.A = Double.Parse(fieldarray(0)), .B = Double.Parse(fieldarray(1)), .C = Double.Parse(fieldarray(2)), .D = Double.Parse(fieldarray(3)), .E = fieldarray(4)})
                End If
            End If
        Loop
    End Using
    SortedFields = SortedFields.OrderBy(Function(x) x.B).Concat(test.OrderByDescending(Function(x) x.B)).ToList
End Function

将数据写入 csv 文件的一种简单方法是使用 IO.File.WriteAllLines 方法和 List 的 ConvertAll 方法:

IO.File.WriteAllLines(" coil.csv", SortedFields("textfile1.txt").ConvertAll(New Converter(Of Fields, String)(Function(x As Fields) x.ToString)))

您会注意到 ToString 方法是如何轻松实现这一点的。

如果该类仅用于此目的,您可以选择将所有字段设为字符串。

【讨论】:

    猜你喜欢
    • 2011-01-06
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 2016-07-01
    • 1970-01-01
    • 2021-06-02
    相关资源
    最近更新 更多