Я использую сервис 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...
Я только что обнаружил очень упрямую ошибку, которую я думал (неправильно) в течение нескольких дней из-за запрета Yahoo на дальнейшие запросы от меня.
Именно по этому URL:
http://where.yahooapis.com/geocode?location=31+Front+Street%2c+Sedgefield%2c+Stockton%06on-Tees%2c+England%2c+TS21+3AT&appid=KGe6P34c
Мой браузер жалуется на ошибку синтаксического анализа этого URL. Моя программа на 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
?) Или из-за ошибки Yahoo?
Несмотря на то, что я вижу, что вызывает эту проблему, я не понимаю, почему. Может кто-нибудь объяснить?
EDIT:
Дальнейшее расследование с моей стороны показывает, что символом, на который кодируется эта гипс, "% 06", является управляющий символ ascii "Подтверждение", "ACK". Я понятия не имею, почему этот персонаж появился здесь. Кажется, что разные места отображают Stockton-on-Tee
по-разному - он выглядит нормально открытым в текстовом редакторе, но к тому времени, когда он появляется в Visual Studio, до кодирования это Stocktonon-Tees
. Обратите внимание, что когда я скопировал предыдущий текст в это текстовое поле в Firefox, гипс отображался как странный квадратный символ, но при последующем редактировании программное обеспечение SO, по-видимому, санировало этот символ.
Я включил ниже класс function & holder, который я использую для анализа файла csv - как вы можете видеть, я не делаю ничего странного, что могло бы привести к появлению неожиданных символов. Опасный персонаж появляется в поле «Город».
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++;
}
}