【问题标题】:Change format of csv file更改 csv 文件的格式
【发布时间】:2015-09-27 15:10:09
【问题描述】:

我有一个格式如下的 csv 文件:

name1
Date,Type
11/06/2015 18:13:42,Red
name2
Date,Type
08/06/2015 18:53:38,Blue
name3
Date,Type
10/06/2015 17:13:33,Yellow
10/06/2015 17:55:11,Green
name4
Date,Type
15/06/2015 11:19:01,Blue
10/06/2015 13:45:05,Orange
name5
Date,Type
10/06/2015 15:05:14,Purple

我需要将格式更改为以下?有人可以推荐一种方法 怎么做?:

name1,11/06/2015 18:13:42,Red
name2,08/06/2015 18:53:38,Blue
name3,10/06/2015 17:13:33,Yellow
name3,10/06/2015 17:55:11,Green
name4,15/06/2015 11:19:01,Blue
name4,10/06/2015 13:45:05,Orange
name5,10/06/2015 15:05:14,Purple

请注意,有些名称有超过 1 个条目。

提前致谢!

【问题讨论】:

    标签: excel csv excel-formula


    【解决方案1】:

    此例程使用 Scripting.Dictionary。您需要进入 VBE 的工具 ► 参考并将 Microsoft Scripting Runtime 添加到您的项目中,然后才能使用它。

    如果您可以将 CSV 作为活动工作簿打开,那么这个简短的例程应该会重新组织您的数据。

    Sub collate_CSV()
        Dim rw As Long, lr As Long, v As Long
        Dim dRECs As New Scripting.Dictionary
        Dim vKEY As Variant, vITM As Variant, vVALs As Variant
        
        dRECs.CompareMode = TextCompare
        ReDim vVALs(1 To 1)
        
        With Sheet1   '<-CSVs almost always have their single worksheet codename as Sheet1
            lr = .Cells(Rows.Count, 1).End(xlUp).Row
            For rw = lr To 2 Step -1
                Select Case LCase(.Cells(rw, 1).Value2)
                    Case vbNullString
                        'do nothing
                    Case "date,type"
                        ReDim Preserve vVALs(1 To UBound(vVALs) - 1)
                        dRECs.Add Key:=.Cells(rw - 1, 1).Value2, Item:=Join(vVALs, ChrW(8203))
                        ReDim vVALs(1 To 1)
                        .Cells(rw - 1, 1).Resize(Rows.Count - rw + 1, 1).EntireRow.Delete
                    Case Else
                        vVALs(UBound(vVALs)) = .Cells(rw, 1).Value2
                        ReDim Preserve vVALs(1 To UBound(vVALs) + 1)
                End Select
                
            Next rw
            
            For Each vKEY In dRECs
                vITM = Split(dRECs.Item(vKEY), ChrW(8203))
                For v = LBound(vITM) To UBound(vITM)
                    .Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) = _
                      vKEY & Chr(44) & vITM(v)
                Next v
            Next vKEY
            
            .Rows(1).EntireRow.Delete
            
        End With
        
    End Sub
    

    您的结果应该类似于以下内容:

            

    结果与原始结果相反。这是从数据底部到顶部的一个因素,随着工作的进行删除已用过的记录。

    【讨论】:

    • 您好,感谢您的评论,看来这不起作用,但也不会引发错误。我确保标签是 Sheet1
    • @SB77 - 不幸的是,它适用于我提供的示例数据。如果没有看到更完整的数据集,我不清楚如何进行。
    • @SB77 - 我怀疑您正在通过双击打开 .CSV,并且数据正在进入一个新工作表,以逗号分隔为 A 和 B 列。这并不代表数据您作为示例显示,但这是对问题的合乎逻辑的猜测。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多