使用 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 将行导出为文本的主要内容,如果未能解决你的问题,请参考以下文章
运行 python manage.py loaddata datadump.json 时出现 DB 错误