我正在使用Yahoo Placefinder服务查找我在csv文件中的地址列表的一些纬度/经度位置。
我使用以下代码:
String reqURL = "http://where.yahooapis.com/geocode?location=" + HttpUtility.UrlEncode(location) + "&appid=KGe6P34c";
XmlDocument xml = new XmlDocument();
xml.Load(reqURL);
XPathNavigator nav = xml.CreateNavigator();
// process xml here...
我刚发现一个非常顽固的错误,我认为(错误地)好几天是由于雅虎禁止我的进一步请求。
适用于此网址:
http://where.yahooapis.com/geocode?location=31+Front+Street%2c+Sedgefield%2c+Stockton%06on-Tees%2c+England%2c+TS21+3AT&appid=KGe6P34c
我的浏览器抱怨该网址的解析错误。我的c#程序说它有500错误。
此处的位置字符串来自此地址:
Agape Business Consortium Ltd.,michael.cutbill@agapesolutions.co.uk,Michael A Cutbill,Director,,,9 Jenner Drive,Victoria Gardens,,Stockton-on-Tee,,TS19 8RE,,England,85111,Hospitals,www.agapesolutions.co.uk
我认为错误来自Stockton-on-Tee
中的第一个连字符,但我无法解释为什么会这样。如果我用“普通”连字符替换这个超级用户,则查询会成功完成。
这个错误是由于我的结果是错误(HttpUtility.UrlEncode
功能不正确吗?)还是雅虎结束的错误?
即使我能看到导致这个问题的原因,我也不明白为什么。有人可以解释一下吗?
编辑:
对我的进一步调查表明,这个被宣传的字符被编码为“%06”,是ascii控制字符“Acknowledge”,“ACK”。我不知道为什么这个角色会出现在这里。似乎不同的地方以不同的方式呈现Stockton-on-Tee
- 它在文本编辑器中看起来是正常的,但是当它在Visual Studio中出现时,在编码之前,它是Stocktonon-Tees
。请注意,当我将前一个复制到firefox中的这个文本框中时,将其作为一个奇怪的方框字符进行渲染,但是在随后的编辑中,SO软件似乎已经对该字符进行了补充。
我在功能&我用来解析csv文件的holder类 - 正如你所看到的,我没有做任何奇怪的事情,可能会引入意想不到的字符。危险的角色出现在“城镇”字段中。
public List<PaidBusiness> parseCSV(string path)
{
List<PaidBusiness> parsedBusiness = new List<PaidBusiness>();
List<string> parsedBusinessNames = new List<string>();
try
{
using (StreamReader readFile = new StreamReader(path))
{
string line;
string[] row;
bool first = true;
while ((line = readFile.ReadLine()) != null)
{
if (first)
first = false;
else
{
row = line.Split(',');
PaidBusiness business = new PaidBusiness(row);
if (!business.bad) // no problems with the formatting of the business (no missing fields, etc)
{
if (!parsedBusinessNames.Contains(business.CompanyName))
{
parsedBusinessNames.Add(business.CompanyName);
parsedBusiness.Add(business);
}
}
}
}
}
}
catch (Exception e)
{ }
return parsedBusiness;
}
public class PaidBusiness
{
public String CompanyName, EmailAddress, ContactFullName, Address, Address2, Address3, Town, County, Postcode, Region, Country, BusinessCategory, WebAddress;
public String latitude, longitude;
public bool bad;
public static int noCategoryCount = 0;
public static int badCount = 0;
public PaidBusiness(String[] parts)
{
bad = false;
for (int i = 0; i < parts.Length; i++)
{
parts[i] = parts[i].Replace("pithawala", ",");
parts[i] = parts[i].Replace("''", "'");
}
CompanyName = parts[0].Trim();
EmailAddress = parts[1].Trim();
ContactFullName = parts[2].Trim();
Address = parts[6].Trim();
Address2 = parts[7].Trim();
Address3 = parts[8].Trim();
Town = parts[9].Trim();
County = parts[10].Trim();
Postcode = parts[11].Trim();
Region = parts[12].Trim();
Country = parts[13].Trim();
BusinessCategory = parts[15].Trim();
WebAddress = parts[16].Trim();
// data testing
if (CompanyName == "")
bad = true;
if (EmailAddress == "")
bad = true;
if (Postcode == "")
bad = true;
if (Country == "")
bad = true;
if (BusinessCategory == "")
bad = true;
if (Address.ToLower().StartsWith("po box"))
bad = true;
// its ok if there is no contact name.
if (ContactFullName == "")
ContactFullName = CompanyName;
//problem if there is no business category.
if (BusinessCategory == "")
noCategoryCount++;
if (bad)
badCount++;
}
}
答案 0 :(得分:2)
欢迎来到真实世界的数据。问题可能出在CSV文件中。要验证,请阅读该行并检查每个字符:
foreach (char c in line)
{
Console.WriteLine("{0}, {1}", c, (int)c);
}
“普通”连字符会给你45的值。
另一个问题可能是您使用错误的编码读取文件。可能是文件被编码为UTF8并且您使用默认编码读取它。您可以在打开文件时尝试指定UTF8:
using (StreamReader readFile = new StreamReader(path, Encoding.UTF8))
执行此操作,然后再次输出该行上的每个字符(如上所示),并查看连字符的字符。