【问题标题】:Read CSV File By Line in ASP在 ASP 中逐行读取 CSV 文件
【发布时间】:2014-04-24 07:34:30
【问题描述】:

我正在尝试使用 VBScript 读取 CSV 文件,但由于无法识别换行符,因此导致了巨大的问题。我现在的方法是:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(server.mappath("my_csv_file.csv"), ForReading)

Do Until objFile.AtEndOfStream
    strLine = objFile.ReadLine
    arrFields = Split(strLine, ",")

   LOOP_STUFF_HERE

Loop

CSV 文件有几行,但问题是它将 CSV 文件全部读取为一个长行,并且每行的最后一项与下一行的第一项合并,因为后面没有逗号最后一行(它是由我的一个客户在 Excel 中创建的,然后发送给我)。我的解决方案是我必须在文本编辑器中打开它,手动在行尾添加一个逗号,然后删除换行符。这从长远来看是行不通的,因为我们正在建立一个自动化系统。

基本上,我需要能够Split 换行符(我尝试过Split(strLine, "\n",但这似乎不起作用),然后一旦它们被换行符拆分,然后拆分他们用逗号。换句话说,它是一个多维数组。

我不知道如何让 VBScript 识别换行符。有任何想法吗?感谢您的帮助。

【问题讨论】:

  • 你试过Split(strLine, CHAR(10)) 吗? Char(10) 表示换行。
  • 文件似乎有问题。如果 32 位窗口在 edit.exe 中打开文件。编辑 /70 /h my_csv_file.csv。状态栏中是字符代码,CR和LF出现音乐符号和菱形。
  • @KayNelson 小修正。 CHAR() 是一个 Excel 函数。 VBScript 等效项是CHR()。但我同意你的建议,尽管不需要CHR()vbCrLf 是默认的 line-ender。如果这不起作用,请尝试vbLf(在 Unix 中流行)或vbCr(在 Mac 上流行)。就个人而言,我会在十六进制编辑器中打开文件,看看里面有什么!
  • 正如@Bond 所说,如果ReadLine() 在一行中显示整个CSV,那么您的CSV 没有使用vbCrLf 作为EOL 标记。这为您提供了两个选项尝试vbCrvbLf 而不是Split(strLine, "\n" 等。另外同意如果您在十六进制编辑器中打开文件,您可能会更好地了解所需内容。您将寻找 0D0A (vbCrLf)、0D (vbCr) 或 0A (vbLf)。
  • 不,抱歉。我的意思是,只要 CSV 中的每一行都以 vbCrLf 结尾,您上面的代码应该 就可以正常工作。由于您的脚本运行不正常,我猜每一行vbCrLf 结尾。所以ReadLine 不适合你。您可能必须阅读整个文件(使用ReadAll 函数),然后按vbCrvbLf 拆分以获得每一行。获取免费的十六进制编辑器,例如 HxD,然后打开 CSV 以查看正在使用的行尾。

标签: csv vbscript asp-classic


【解决方案1】:

使用FileSystem Object? 读取 CSV。不要重新发明轮子,在 ASP 中有很多不同且经过验证的方法可以完全满足您的需求。

最简单的方法是使用OLEDB JetOLEDB ACE驱动读取文件

基本上你需要创建一个带有特定Connection StringOLEDB.Connection 对象来获取CSV 中的所有数据作为行;稍后您可以使用GetRows 方法将所有数据作为数组传递,也可以直接使用Recordset object

使用此功能的相关帖子

ASP.NET(王牌)When reading a CSV file using a DataReader and the OLEDB Jet data provider, how can I control column data types?

ASP.NET(王牌)Microsoft.ACE.OLEDB.12.0 CSV ConnectionString

ASP-Classic (Jet) Reading csv file in classic asp. Problem: column values are truncated up to 300 characters

Jet 或 Ace 驱动程序的连接几乎相同(这是重要部分)。

【讨论】:

  • 我正在研究这个,看起来你已经让我走上了正确的道路,但我无法弄清楚语法。最后一个(Jet)似乎对我正在使用的代码有正确的语法,但我对它到底在做什么非常不熟悉。我应该只是将“server.MapPath”括号中的信息更新到我的 CSV 文件的位置吗?
  • 我尝试只使用该示例中的第一行 set connection = Server.CreateObject ("ADODB.Connection") connection.Open Connection_string 但这会引发错误。我想我不明白如何正确设置连接?
  • 您当前的连接字符串是什么样的...(根据您的新代码更新您的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-23
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多