【发布时间】:2019-01-31 12:47:22
【问题描述】:
我正在尝试从 Web 服务的 csv 文件中获取数据。 如果我将 url 粘贴到浏览器中,则会下载 csv,如下所示:
"ID","ProductName","Company"
"1","Apples","Alfreds futterkiste"
"2","Oranges","Alfreds futterkiste"
"3","Bananas","Alfreds futterkiste"
"4","Salad","Alfreds futterkiste"
...next 96 rows
但是我不想先下载 csv 文件,然后再从中提取数据。 Web 服务使用分页并返回 100 行(由 &num 参数确定,最大值为 100)。在第一个请求之后,我可以使用 &next 参数根据 ID 获取接下来的 100 行。例如网址
http://testWebservice123.com/Example.csv?auth=abc&number=100&next=100
我会得到从 ID 101 到 200 的行。所以如果有很多行,我最终会下载很多 csv 文件并将它们保存到硬盘驱动器。因此,与其先下载 csv 文件并将它们保存到硬盘中,不如直接从 web 服务获取数据,以便能够直接写入数据库而不保存 csv 文件。
经过一番搜索,我想出了以下解决方案
static void Main(string[] args)
{
string startUrl = "http://testWebservice123.com/Example.csv?auth=abc&number=100";
string url = "";
string deltaRequestParameter = "";
string lastLine;
int numberOfLines = 0;
do
{
url = startUrl + deltaRequestParameter;
WebClient myWebClient = new WebClient();
using (Stream myStream = myWebClient.OpenRead(url))
{
using (StreamReader sr = new StreamReader(myStream))
{
numberOfLines = 0;
while (!sr.EndOfStream)
{
var row = sr.ReadLine();
var values = row.Split(',');
//do whatever with the rows by now - i.e. write to console
Console.WriteLine(values[0] + " " + values[1]);
lastLine = values[0].Replace("\"", ""); //last line in the loop - get the last ID.
numberOfLines++;
deltaRequestParameter = "&next=" + lastLine;
}
}
}
} while (numberOfLines == 101); //since the header is returned each time the number of rows will be 101 until we get to the last request
}
但我不确定这是否是一种“最新”的方式,或者是否有更好的方式(更容易/更简单)?换句话说,我不知道使用 WebClient 和 StreamReader 是否是正确的方法?
在此线程中:how to read a csv file from a url?
WebClient.DownloadString 与 WebRequest 一样被提及。但是,如果我想写入数据库而不将 csv 保存到 hdd,这是最好的选择吗?
Furhtermore - 我采取的方法是将数据保存到幕后的临时磁盘存储中,还是将所有数据读入内存,然后在循环完成时处理? 我已阅读以下文档,但似乎无法找出它在幕后的作用: StreamReader:https://docs.microsoft.com/en-us/dotnet/api/system.io.streamreader?view=netframework-4.7.2
流:https://docs.microsoft.com/en-us/dotnet/api/system.io.stream?view=netframework-4.7.2
编辑: 我想我也可以使用以下“TextFieldParser”......但我的问题仍然是一样的:
(使用程序集 Microsoft.VisualBasic)
using (Stream myStream = myWebClient.OpenRead(url))
{
using (TextFieldParser parser = new TextFieldParser(myStream))
{
numberOfLines = 0;
parser.TrimWhiteSpace = true; // if you want
parser.Delimiters = new[] { "," };
parser.HasFieldsEnclosedInQuotes = true;
while (!parser.EndOfData)
{
string[] line = parser.ReadFields();
Console.WriteLine(line[0].ToString() + " " + line[1].ToString());
numberOfLines++;
deltaRequestParameter = "&next=" + line[0].ToString();
}
}
}
【问题讨论】: