【问题标题】:Make a CSV from a MySql table in ASP Classic从 ASP Classic 中的 MySql 表创建 CSV
【发布时间】:2013-05-22 15:15:21
【问题描述】:

有人要求我在 ASP Classic 中的网站上制作一种“导出”功能。

我认为制作起来很简单,但我遇到了一些问题。我在文件中得到了正确的行数,但我总是得到相同的记录集行,就像记录集在 foreach 循环期间没有更新值一样。

这是我的代码:

dim fs,f
set fs = Server.CreateObject("Scripting.FileSystemObject")
set f = fs.OpenTextFile(Server.MapPath("thebackupfile.csv"), 8, true)

set RS = conn.execute("SELECT * FROM sometable")

For each fField in RS.Fields 
    row = row & " " & fField.Name & ";"     
Next

row = left (row, len(row)-1)

f.WriteLine(row)

do while not RS.EOF
    For each fField in RS.Fields 
        csv = csv &" "& RS(fField.Name) & ";"     
    Next
    csv = left (csv, len(csv)-1)

    f.WriteLine(csv)
    RS.movenext
loop

f.Close
set f = Nothing
set fs = Nothing

我不明白为什么我得到n 乘以第一行,而n 等于记录集中的行数。

有什么建议吗?我是否采取了错误的方式来做到这一点?

【问题讨论】:

    标签: csv asp-classic vbscript recordset writetofile


    【解决方案1】:

    我确实发现了一个错误,但这些结果对我来说也很奇怪。我看到的错误是您没有在每次迭代时清除 csv 变量。我希望你有 n(log n) 行,因为在编写每个新行时,你还会重复之前的所有内容。


    更新:再读一遍,你写一个新行的唯一一次是在记录边界作为f.WriteLine()调用的一部分,所以我期望你得到正确数量的行,但每一行会越来越长,新的东西会添加到行的末尾。向右滚动文件,我打赌你会看到每一行中的项目。

    这意味着我下面的代码应该可以解决您的整个问题。


    要通过清除 csv 变量来修复错误,而不是添加代码来重置它,我会进行更改以完全避免缓冲区字符串变量,并将所有内容直接写入您的流。我还添加了代码来经常刷新流。这些变化在网络环境中很重要。如果您不刷新缓冲区,您的浏览器可能很长一段时间都看不到来自 Web 服务器的任何响应,这可能会导致超时错误。鉴于这被标记为asp-classic,我想知道您根本写入文件,而不是响应流。

    dim fs,f,d
    set fs = Server.CreateObject("Scripting.FileSystemObject")
    set f = fs.OpenTextFile(Server.MapPath("thebackupfile.csv"), 8, true)
    d = ""
    
    set RS = conn.execute("SELECT * FROM sometable")
    
    For each fField in RS.Fields 
        f.Write(d)
        f.Write(fField.Name)
        f.Write(" ")
        d= ";"     
    Next
    
    f.WriteLine("")
    
    Dim i
    i = 0
    
    do while not RS.EOF
        d = ""
        For Each fField in RS.Fields 
            f.Write(d)
            f.Write(" ")
            f.Write(RS(fField.Name))
            d = ";"    
        Next
    
        f.WriteLine("")
        RS.movenext
    
        i = i + 1
        If i Mod 50 = 0 Then
           f.Flush
        End If
    Loop
    
    f.Close
    set f = Nothing
    set fs = Nothing
    

    【讨论】:

    • 实际上这项工作,但我必须在 f.write 和刷新之前进行 NULL 值检查...给我一个 500 错误实际上我已经删除它并且一切顺利,现在我'会检查一些周转。非常感谢!
    【解决方案2】:

    您应该首先将记录的值加载到一个数组中,然后将该数组连接到一个分隔符分隔的行中,然后将该行写入输出文件:

    set RS = conn.Execute("SELECT * FROM sometable")
    
    fields = Array()
    Redim fields(RS.Fields.Count-1)
    
    For i = 0 To RS.Fields.Count-1
      fields(i) = RS.Fields(i).Name
    Next
    f.WriteLine """" & Join(fields, """;""") & """"
    
    Do Until RS.EOF
      For i = 0 To RS.Fields.Count-1
        fields(i) = RS.Fields(i).Value
      Next
      f.WriteLine """" & Join(fields, """;""") & """"
    
      RS.MoveNext
    Loop
    

    然而,比这更好的是拥有 MySQL directly generate the output file:

    SELECT *
    FROM sometable
    INTO OUTFILE 'C:\\path\\to\\thebackupfile.csv'
    FIELDS TERMINATED BY ';'
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    

    【讨论】:

    • 太糟糕了,我有一个来自公共主机的 mysql,所以我不能使用 INTO OUTFILE,但这真的是一件好事,我不知道!谢谢!
    猜你喜欢
    • 2018-09-08
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    相关资源
    最近更新 更多