使用 datadump 将行导出为文本

Posted

技术标签:

【中文标题】使用 datadump 将行导出为文本【英文标题】:Export rows to text with datadump 【发布时间】:2021-07-15 23:39:49 【问题描述】:

这个脚本做了我需要的一切,除了一件事:它只导出 Col B,我需要它来导出 col B:H(使用 A 作为文件名,这个脚本就是这样做的)。

编辑:实际上,我现在不确定是否可以使用这种方法。我更仔细地查看了生成的 md 文件,到处都有额外的 " 标记,例如,在文件的开头和结尾,以及 excel 单元格内容中的所有合法引号周围。 结束编辑。

Sub DataDump()

Dim X
Dim lngRow As Long
Dim StrFolder As String

StrFolder = "C:\temp"
X = Range([a1], Cells(Rows.Count, 2).End(xlUp))
For lngRow = 1 To UBound(X)
Open StrFolder & "\" & X(lngRow, 1) & ".md" For Output As #1
Write #1, X(lngRow, 2)
Close #1
Next
End Sub

目的:

我需要将每一行导出为一个 md 文件,其中 Col A 成为 Title,内容是 Cols B:H。我可以在谷歌表格中做到这一点,但由于源代码在 excel 中,我更喜欢使用 VBA。这是我发现的第一个成功(并且超快)的脚本(我有 7,000 行)。

我尝试过的:

我已经尝试修改范围,并且我将所有“2”增加到“5”,认为这是一个列,但事实并非如此;选择 5 仅表示它使用该单列。

我很少使用 excel,所以我真的不知道如何使用 VBA,但我确实有这个 google sheet 脚本可以解决问题(在我一次将 100 行从 excel 复制/粘贴到 gsheets 之后),但是伙计,它很慢,我一次只能做 100 行。如果有帮助,这里是谷歌表格脚本:

  function saveRowsToMDfile() 
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getActiveSheet();
  var range = sheet.getRange("A1:H100");
    var rows = range.getValues();
  var folder = DriveApp.getFoldersByName("Test").next();
  var files = folder.getFiles();
  while(files.hasNext()) files.next().setTrashed(true);
  rows.forEach(function(row) 
    var title = row[0]; //set first element of array as title
    row.shift(); //remove first element of the array 
    var content = row.join("\n");
    folder.createFile(title + ".md", content);
  ); 


对于可能会问同样问题的其他人,以下脚本将 A-H 行保存为 md 文件,其中 col A 是文件名(您可以修改列数并将 md 更改为 txt 并修改文件所在的路径保存)为 UTF8 没有 BOM。我对 VB 还不够熟悉,不知道可以从这个脚本中删除什么——我所知道的是它的作用就像魅力:

Sub DataDump()
    
    Const STR_FOLDER As String = "D:\FilmDatabase\"
    Dim ws As Worksheet, lngRow As Long, arr
    
    Set ws = ActiveSheet
    For lngRow = 1 To ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
        'get row as 2D array and convert to 1D array
        arr = Application.Transpose(Application.Transpose(ws.Cells(lngRow, "B").Resize(1, 7).Value))
        PutContent3 STR_FOLDER & ws.Cells(lngRow, 1) & ".md", Join(arr, vbLf)
    Next lngRow
    
End Sub



'EDIT: try this  - may handle accented text better
'https://***.com/questions/2524703/save-text-file-utf-8-encoded-with-vba
Sub PutContent2(f As String, content As String)
    With CreateObject("ADODB.Stream")
        .Type = 2 'text/string data
        .Charset = "utf-8"
        .Open
        .WriteText content
        .SaveToFile f, 2 'Save to disk
    End With
End Sub

Sub PutContent3(f As String, content As String)
    
    Dim BinaryStream As Object
    Dim UTFStream As Object

    Set UTFStream = CreateObject("adodb.stream")

    UTFStream.Type = 2
    UTFStream.Mode = 3
    UTFStream.Charset = "UTF-8"
    UTFStream.Open
    UTFStream.WriteText content

    UTFStream.Position = 3 'skip BOM

    Set BinaryStream = CreateObject("adodb.stream")
    BinaryStream.Type = 1
    BinaryStream.Mode = 3
    BinaryStream.Open

    UTFStream.CopyTo BinaryStream

    UTFStream.Flush
    UTFStream.Close
    Set UTFStream = Nothing

    BinaryStream.SaveToFile f, 2
    BinaryStream.Flush
    BinaryStream.Close
    Set BinaryStream = Nothing
End Sub

【问题讨论】:

【参考方案1】:

试试这个:

Sub DataDump()
    
    Const STR_FOLDER As String = "C:\tester\tmp\"
    Dim ws As Worksheet, lngRow As Long, arr
    
    Set ws = ActiveSheet
    For lngRow = 1 To ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
        'get row as 2D array and convert to 1D array 
        arr = Application.Transpose(Application.Transpose(ws.Cells(lngRow, "B").Resize(1, 7).Value))
        PutContent STR_FOLDER & ws.Cells(lngRow, 1) & ".md", Join(arr, vbLf)
    Next lngRow
    
End Sub

'write out a text file...
Sub PutContent(f As String, content As String)
    CreateObject("scripting.filesystemobject"). _
                  opentextfile(f, 2, True).Write content
End Sub

'EDIT: try this  - may handle accented text better
'https://***.com/questions/2524703/save-text-file-utf-8-encoded-with-vba
Sub PutContent2(f As String, content As String)
    With CreateObject("ADODB.Stream")
        .Type = 2 'text/string data
        .Charset = "utf-8" 
        .Open
        .WriteText content
        .SaveToFile f, 2 'Save to disk
    End With
End Sub

【讨论】:

这个人快疯了,所有多余的引号都没了。谢谢!但是,它不会呈现重音或特殊字符。我在 Notepad++ 中打开生成的文件,它说文件是 UTF-8,但仍然得到垃圾字符。是否可以添加一些东西来防止这种情况发生,或者只是它的方式......? 查看上面的编辑了解写入文件的不同方法。 编辑可以解决问题,但会保存为带有 bom 的 utf-8,这会干扰 yaml。您列出的线程(以及我读过的其他线程)中的讨论对我来说太高级了,所以我将使用您的脚本并研究可以处理 md 文件文件夹以剥离 bom 的自动转换工具。再次感谢您的帮助。非常感谢。

以上是关于使用 datadump 将行导出为文本的主要内容,如果未能解决你的问题,请参考以下文章

数据泵EXPDP导出工具和IMPDP导入工具的使用

运行 python manage.py loaddata datadump.json 时出现 DB 错误

由于夹具错误,Django datadump 和 loaddata 无法正常工作

ASP.NET导出Excel文件

将分组按钮的大小调整为文本区域的大小?

为文本表更改 Tableau 的自动标签