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

标签 asp.net vb.net file-io csv

这就是我所拥有的。有用。但是,有没有更简单或更好的方法呢?

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

<asp:HyperLink ID="HyperLinkDownload" runat="server" NavigateUrl="~/Download.aspx">Download as CSV file</asp:HyperLink>

然后我就得到了 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

最佳答案

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 中,我发现的最好的解析器(免费)是 Fast CSV ReaderCodeProject 。我实际上已经在生产代码中使用了它,它真的非常快,而且非常易于使用!

关于asp.net - 如何最好地生成 CSV(逗号分隔文本文件)以供使用 ASP.NET 下载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44194/

相关文章:

c# - 在后面的代码中隐藏 div 元素

c# - 如何在 Kestrel 中配置端点?

c# - 当 IFrame XPAD 在页面上时,ModalPopup 单击两次

java - 在 Android 应用程序中读取文件需要太多时间

python - 从Python中的IDLE编辑器指向源文件

c# - 简单注入(inject)器 Web Api Controller 构造函数注入(inject)失败

c# - MSChart 轴上的固定间隔

vb.net - 将变量保存到 vb.net 中的文本文件

.net - 将小数转换为小时和分钟

android - 从 AndroidTestProject 加载文本文件