当前位置:  开发笔记 > 编程语言 > 正文

如何使用ASP.NET最好地生成CSV(逗号分隔的文本文件)以供下载?

如何解决《如何使用ASP.NET最好地生成CSV(逗号分隔的文本文件)以供下载?》经验,为你挑选了2个好方法。

这就是我所拥有的.有用.但是,有更简单或更好的方法吗?

一个ASPX页面,我有下载链接...

Download as CSV file

然后我得到了Download.aspx.vb代码...

Public Partial Class Download
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'set header
        Response.Clear()
        Response.ContentType = "text/csv"
        Dim FileName As String = "books.csv"
        Response.AppendHeader("Content-Disposition", "attachment;filename=" + FileName)

        'generate file content
        Dim db As New bookDevelopmentDataContext
        Dim Allbooks = From b In db.books _
                       Order By b.Added _
                       Select b
        Dim CsvFile As New StringBuilder
        CsvFile.AppendLine(CsvHeader())
        For Each b As Book In Allbooks
            CsvFile.AppendLine(bookString(b))
        Next

        'write the file
        Response.Write(CsvFile.ToString)
        Response.End()
    End Sub

    Function CsvHeader() As String
        Dim CsvLine As New StringBuilder
        CsvLine.Append("Published,")
        CsvLine.Append("Title,")
        CsvLine.Append("Author,")
        CsvLine.Append("Price")
        Return CsvLine.ToString
    End Function

    Function bookString(ByVal b As Book) As String
        Dim CsvLine As New StringBuilder
        CsvLine.Append(b.Published.ToShortDateString + ",")
        CsvLine.Append(b.Title.Replace(",", "") + ",")
        CsvLine.Append(b.Author.Replace(",", "") + ",")
        CsvLine.Append(Format(b.Price, "c").Replace(",", ""))
        Return CsvLine.ToString
    End Function

End Class

Simon Gillbe.. 22

CSV格式有一些问题.你问过自己这些问题:

我的任何数据都有嵌入的逗号吗?

我的任何数据都嵌入了双引号吗?

我的任何数据都有换行符吗?

我需要支持Unicode字符串吗?

我在上面的代码中看到了几个问题.首先是逗号的东西......你正在删除逗号:

CsvLine.Append(Format(b.Price, "c").Replace(",", ""))

为什么?在CSV中,您应该包含任何带引号的逗号:

CsvLine.Append(String.Format("\"{0:c}\"", b.Price))

(或类似的东西......我的VB不是很好).如果你不确定是否有逗号,但在它周围加上引号.如果字符串中有引号,则需要通过加倍来转义它们."成为"".

b.Title.Replace("\"", "\"\"")

如果你愿意,可以用引号括起来.如果字符串中有换行符,则需要用引号括住该字符串...是的,CSV文件允许使用文字换行符.对人类来说看起来很奇怪,但这一切都很好.

一个好的CSV编写器需要一些思考.一个好的CSV阅读器(解析器)只是很难(并且没有,正则表达式不足以解析CSV ...它只会让你大约95%的方式).

然后是Unicode ...或更普遍的I18N(国际化)问题.例如,您正在从格式化价格中删除逗号.但这是假设价格的格式符合您在美国的预期.在法国,数字格式是相反的(使用句号代替逗号,反之亦然).最重要的是,尽可能使用与文化无关的格式.

虽然这里的问题是生成 CSV,但您不可避免地需要解析CSV.在.NET中,我找到的最好的解析器(免费)是CodeProject上的Fast CSV Reader.我实际上在生产代码中使用它,它真的非常快,而且非常容易使用!



1> Simon Gillbe..:

CSV格式有一些问题.你问过自己这些问题:

我的任何数据都有嵌入的逗号吗?

我的任何数据都嵌入了双引号吗?

我的任何数据都有换行符吗?

我需要支持Unicode字符串吗?

我在上面的代码中看到了几个问题.首先是逗号的东西......你正在删除逗号:

CsvLine.Append(Format(b.Price, "c").Replace(",", ""))

为什么?在CSV中,您应该包含任何带引号的逗号:

CsvLine.Append(String.Format("\"{0:c}\"", b.Price))

(或类似的东西......我的VB不是很好).如果你不确定是否有逗号,但在它周围加上引号.如果字符串中有引号,则需要通过加倍来转义它们."成为"".

b.Title.Replace("\"", "\"\"")

如果你愿意,可以用引号括起来.如果字符串中有换行符,则需要用引号括住该字符串...是的,CSV文件允许使用文字换行符.对人类来说看起来很奇怪,但这一切都很好.

一个好的CSV编写器需要一些思考.一个好的CSV阅读器(解析器)只是很难(并且没有,正则表达式不足以解析CSV ...它只会让你大约95%的方式).

然后是Unicode ...或更普遍的I18N(国际化)问题.例如,您正在从格式化价格中删除逗号.但这是假设价格的格式符合您在美国的预期.在法国,数字格式是相反的(使用句号代替逗号,反之亦然).最重要的是,尽可能使用与文化无关的格式.

虽然这里的问题是生成 CSV,但您不可避免地需要解析CSV.在.NET中,我找到的最好的解析器(免费)是CodeProject上的Fast CSV Reader.我实际上在生产代码中使用它,它真的非常快,而且非常容易使用!



2> Joel Coehoor..:

我通过以下函数传递所有CSV数据:

Function PrepForCSV(ByVal value As String) As String
    return String.Format("""{0}""", Value.Replace("""", """"""))
End Function

此外,如果你没有提供HTML,你可能需要一个http处理程序(.as h x文件)而不是一个完整的网页.如果你在Visual Studio中创建一个新的处理程序,你很可能只是将你现有的代码复制到main方法中,它只会起作用,你的工作会有很小的性能提升.

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有