|
Well, if your database doesn't support geo types, you could always store them as floats. To get the difference, use the Haversine[^] formula.
|
|
|
|
|
How about some codez:
public double HaversineDistance(Location location) {
double R = 6371;
double dLat = (location.Latitude - Latitude).ToRadians();
double dLon = (location.Longitude - Longitude).ToRadians();
double a = Math.Pow(Math.Sin(dLat / 2), 2) +
Math.Cos(Latitude.ToRadians()) * Math.Cos(location.Latitude.ToRadians()) *
Math.Pow(Math.Sin(dLon / 2), 2);
double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
double d = R * c;
return d;
}
|
|
|
|
|
naveen 2012 wrote: calculate distance between those latlongs
"Great circle" distance? Or "rectilinear" distance? Or "digging a hole to China" distance?
P.S. I forgot about the "Dalek Dave Pub Crawl Distance".
|
|
|
|
|
<div class="bo9 space">
<table border="0" cellspacing="0" cellpadding="0" class="bot">
<thead>
<tr>
<th class="bor f2" colspan="13"><h2>Mở thưởng chủ nhật ngày 30/12/2012</h2>
</th>
</tr>
</thead>
<tbody>
<tr>
<td class="span-2 bol f1b db"><h3>Đặc Biệt</h3></td>
<td class="bor f2 db" colspan="12">21505</td>
</tr>
<tr>
<td class="span-2 bol f1b"><h3>Giải Nhất</h3></td>
<td class="bor f2" colspan="12">00305</td>
</tr>
<tr>
<td class="span-2 bol f1b"><h3>Giải Nhì</h3></td>
<td class="bol f2" colspan="6">16086</td>
<td class="bor f2" colspan="6">54638</td>
</tr>
<tr>
<td class="span-2 bol f1b" rowspan="2"><h3>Giải Ba</h3></td>
<td class="bol f2" colspan="4">85671</td>
<td class="bol f2" colspan="4">74937</td>
<td class="bor f2" colspan="4">60046</td></tr>
<tr><td class="bol f2" colspan="4">48910</td>
<td class="bol f2" colspan="4">28668</td>
<td class="bor f2" colspan="4">73173</td>
</tr>
<tr>
<td class="span-2 bol f1b"><h3>Giải Tư</h3></td>
<td class="bol f2" colspan="3">2979</td>
<td class="bol f2" colspan="3">1875</td>
<td class="bol f2" colspan="3">9307</td>
<td class="bor f2" colspan="3">1100</td>
</tr>
<tr>
<td class="span-2 bol f1b" rowspan="2"><h3>Giải Năm</h3></td>
<td class="bol f2" colspan="4">7891</td>
<td class="bol f2" colspan="4">4924</td>
<td class="bor f2" colspan="4">2383</td></tr>
<tr><td class="bol f2" colspan="4">6579</td>
<td class="bol f2" colspan="4">7116</td>
<td class="bor f2" colspan="4">1362</td>
</tr>
<tr>
<td class="span-2 bol f1b"><h3>Giải Sáu</h3></td>
<td class="bol f2" colspan="4">376</td>
<td class="bol f2" colspan="4">929</td>
<td class="bor f2" colspan="4">292</td>
</tr>
<tr>
<td class="span-2 bol f1b"><h3>Giải Bảy</h3></td>
<td class="bol f2" colspan="3">48</td>
<td class="bol f2" colspan="3">15</td>
<td class="bol f2" colspan="3">65</td>
<td class="bor f2" colspan="3">62</td>
</tr>
<tr>
<th class="bor f1" colspan="13">Nhận KQXS Thủ Đô : Soạn KXTD gửi 8185</th>
</tr>
</tbody>
</table>
</div>
How to extract tab table in this html code use regular expressions?
Thank!
|
|
|
|
|
|
Short.
Sweet.
Accurate.
If you get an email telling you that you can catch Swine Flu from tinned pork then just delete it. It's Spam.
|
|
|
|
|
PIEBALDconsult wrote: Use an XmlDocument.
Or the HTML Agility Pack[^]!
Bob Dole The internet is a great way to get on the net.
2.0.82.7292 SP6a
|
|
|
|
|
I suppose, but I prefer to limit reliance on third-party products.
|
|
|
|
|
I have the following function which I got online, and have changed to suit my needs :-
private Boolean SheetExists(string strFilename)
{
Boolean Match = false;
OleDbConnection objConn = null;
System.Data.DataTable dt = null;
try
{
String connString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + strFilename + ";Extended Properties=Excel 8.0;";
objConn = new OleDbConnection(connString);
objConn.Open();
dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
String[] excelSheets = new String[dt.Rows.Count];
int i = 0;
foreach (DataRow row in dt.Rows)
{
excelSheets[i] = row["TABLE_NAME"].ToString();
i++;
}
for (int j = 0; j < excelSheets.Length; j++)
{
if (excelSheets[j] == "Sheet1$")
{
Match = true;
}
}
if (Match == true)
return true;
else
return false;
}
finally
{
if (objConn != null)
{
objConn.Close();
objConn.Dispose();
}
if (dt != null)
{
dt.Dispose();
}
}
}
Basically it checks if sheet1 exists in a workbook. I'm currently using the variable "Match" to obtain a "return true" or a "return false". I'm sure it possible to modify the code so that it returns the true/false directly, I just can't figure out how.
Any ideas? Thanks
|
|
|
|
|
Modify your test so it breaks out of the loop as soon as a match is found
for (int j = 0; j < excelSheets.Length; j++)
{
if (excelSheets[j] == "Sheet1$")
{
Match = true;
break;
}
}
//delete the following lines after the loop
if (Match == true)
return true;
else
return false;
// add this line after the finally block
return Match;
[edit]
You could actually check the names in your foreach block to make it more efficient.
[/edit]
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
Brilliant - now that I see it, it makes perfect sense. Taking some time to get used to C# from VBA
Thank you for your help
|
|
|
|
|
My pleasure; good luck with the rest of the project.
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
Just saw your edit about checking the names. Good idea. I changed the code to
int i = 0;
foreach (DataRow row in dt.Rows)
{
excelSheets[i] = row["TABLE_NAME"].ToString();
if (excelSheets[i] == "Sheet1$")
{
Match = true;
break;
}
i++;
}
Thanks again!
|
|
|
|
|
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
Why not really simplify it?
private Boolean SheetExists(string strFilename)
{
String connString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=" + strFilename + ";Extended Properties=Excel 8.0;";
using (OleDbConnection objConn = new OleDbConnection(connString))
{
objConn.Open();
using (System.Data.DataTable dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null))
{
foreach (DataRow row in dt.Rows)
{
if (row["TABLE_NAME"].ToString() == "Sheet1$")
{
return true;
}
}
return false;
}
}
}
|
|
|
|
|
Good question, and great answer. I'll give this a try when I get to work. Thank you!
|
|
|
|
|
How could I modify this code so I could check for 2 sheet names, for example, Sheet1 and Sheet2?
Thanks.
|
|
|
|
|
Just change the conditional in the loop.
From:
if (row["TABLE_NAME"].ToString() == "Sheet1$")
{
return true;
}
To:
string tableName = row["TABLE_NAME"].ToString();
if (tableName == "Sheet1$" ||
tableName == "Sheet2$")
{
return true;
}
If, instead, you have an array or List<string> containing multiple sheet names (for example, called SheetNames ), you could do it like:
if (SheetNames.Contains(row["TABLE_NAME"].ToString()))
{
return true;
}
Unless he list of sheet names is used in several places in the code, the direct comparisons in the tableName == ... case is probably the way to go.
|
|
|
|
|
That's great, thanks. Maybe you could help with a similar issue, as I'm really not sure on the best way to approach this...
I have this :-
switch (SuppCode)
{
case "COR1":
Sheet1Name = "Sheet1";
Sheet2Name = null;
Sheet3Name = null;
break;
case "HAV1":
Sheet1Name = "Summary";
Sheet2Name = "Unit_Rates";
Sheet3Name = "Other_Charges";
break;
}
Basically, I can't figure out how to check for the correct sheet names based on the Switch. There will never be more than 3 sheets to check for, but there might be less than 3 - hence the null. Sheet1Name, etc are used in other functions, so I'd like to keep them...
Any thoughts?
|
|
|
|
|
It should be just like my "middle" case:
string tableName = row["TABLE_NAME"].ToString();
if (tableName == Sheet1Name ||
tableName == Sheet2Name ||
tableName == Sheet3Name)
{
return true;
}
It doesn't matter if any of the Sheet?Name values are null, the individual comparisons will be false which is exactly the behavior you want.
|
|
|
|
|
Ok, as a test I entered :-
foreach (DataRow row in dt.Rows)
{
string tableName = row["TABLE_NAME"].ToString();
if (tableName == Sheet1Name + "$" ||
tableName == Sheet2Name + "$" ||
tableName == Sheet3Name + "$")
{
Exists = true;
}
}
if (Exists == true)
{
MessageBox.Show("Match");
}
else
MessageBox.Show("No Match");
and even when Sheet3Name isn't in the spreadsheet...
if (Exists == true)
...is called.
Where am I going wrong?
|
|
|
|
|
Ok, this does what I want :-
if (Sheet1Name != null)
{
foreach (DataRow row in dt.Rows)
{
if (row["TABLE_NAME"].ToString() == Sheet1Name+"$")
{
Exists = true;
}
}
}
if (Sheet2Name != null)
{
Exists = false;
foreach (DataRow row in dt.Rows)
{
if (row["TABLE_NAME"].ToString() == Sheet2Name + "$")
{
Exists = true;
}
}
}
if (Sheet3Name != null)
{
Exists = false;
foreach (DataRow row in dt.Rows)
{
if (row["TABLE_NAME"].ToString() == Sheet3Name + "$")
{
Exists = true;
}
}
}
if (Exists == true)
{
MessageBox.Show("Match");
}
else
MessageBox.Show("No Match");
...but surely there must be a more efficient way of coding this?
|
|
|
|
|
See my previous posting.
Also, this has a problem.
If Sheet2Name != null then the checking for Sheet1Name is ignored! (Exists is reset to false !)
Likewise if Sheet3Name != null then the checking for Sheet1Name and Sheet2Name are ignored.
This also, requires 3 loops through the dt.Rows .
|
|
|
|
|
Matt,
Out of curiosity (as I'll be using your approach) if Sheet2Name != null why is checking for Sheet1Name ignored?
As I read it (if I have 1 sheetname to check), Sheet 1 is checked and Exists is set to true. Sheet2Name and Sheet3Name will be Null, and therefore their loops will be skipped, leaving Exists at true. No?
|
|
|
|
|
I'm assuming that you need to check if all of the non-null sheet names are present (as I said in the previous posting). Your first posting with the Sheet?Name variables indicated that 1, 2 or all 3 Sheet?Name variables could be non-null .
So you first check if the Sheet1Name is present, if so, you set Exists = true .
Then, if Sheet2Name != null the first thing you do is set Exists = false . At this point you have no information about whether Sheet1Name was present or not. You are effectively ignoring the Sheet1Name status.
You can easily remedy this by adding Exists && before the Sheet2Name != null (and Sheet3Name case).
This implicitly propagates the previous sheet name checking to the next checking step. It also, avoids pointless effort if an earlier step fails.
|
|
|
|