Ce code vise à additionner une colonne de valeurs décimales, mais lève une exception à la ligne int.Parse()
. S'il vous plaît voir vers la fin de ce post pour savoir comment j'ai essayé de réviser le code pour corriger ceci et l'erreur que j'ai reçu avec cette tentative.
static void Main()
{
String htmlFile = "C:/Temp/Test11.html";
HtmlDocument doc = new HtmlDocument();
doc.Load(htmlFile);
// Site Collection Storage Used (GB)
var sum = doc.DocumentNode.SelectSingleNode("//table")
// The sum will be of the row elements
.Elements("tr")
// Skip this many rows from the top
.Skip(1)
// .ElementAt(2) = third column
// .Last() = last column
.Sum(tr => int.Parse(tr.Elements("td").ElementAt(3).InnerText));
Console.WriteLine("Site Collection Storage Used (GB): " + sum);
Console.ReadLine();
}
Voici l'exception:
System.FormatException was unhandled
HResult=-2146233033
Message=Input string was not in a correct format.
Source=mscorlib
StackTrace:
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
at System.Int32.Parse(String s)
at ValueSpecifiedCellSpecifiedTable.Program.<Main>b__2(HtmlNode tr) in c:\Users\User1\Documents\Visual Studio 2012\Projects\_ValueSpecifiedCellSpecifiedTable\ValueSpecifiedCellSpecifiedTable\Program.cs:line 92
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.Sum(IEnumerable`1 source)
at System.Linq.Enumerable.Sum[TSource](IEnumerable`1 source, Func`2 selector)
at ValueSpecifiedCellSpecifiedTable.Program.Main() in c:\Users\User1\Documents\Visual Studio 2012\Projects \_ValueSpecifiedCellSpecifiedTable\ValueSpecifiedCellSpecifiedTable\Program.cs:line 85
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
J'ai essayé de remplacer int.Parse () par Decimal.Parse () mais il me dit:
"Error 1 Cannot implicitly convert type 'decimal' to 'int'. An explicit conversion exists (are you missing a cast?) C:\Users\hptSetupAdmin\Documents\Visual Studio 2012\Projects\_ValueSpecifiedCellSpecifiedTable\ValueSpecifiedCellSpecifiedTable \Program.cs 92 17 ValueSpecifiedCellSpecifiedTable
Après avoir changé int.Parse()
en Decimal.Parse()
je ne vois pas s’il ya un int
à convertir.
S'il vous plaît aidez-moi avec ce code pour atteindre mon objectif.
Voici le fichier html pour référence:
<html>
<head>
<title>Tables</title>
</head>
<body>
<table border="1">
<tr>
<th>Environment</th>
<th>Databases</th>
<th>Sites</th>
<th>Site Collection Storage Used (GB)</th>
<th>Ref</th>
</th>
</tr>
<tr>
<td>Public</td>
<td>14</td>
<td>28</td>
<td>32.6602</td>
<td>2</td>
</tr>
<tr>
<td>Local</td>
<td>5</td>
<td>8</td>
<td>7.0302</td>
<td>3</td>
</tr>
<tr>
<td>Shared</td>
<td>6</td>
<td>9</td>
<td>17.092</td>
<td>9</td>
</tr>
</table>
La conversion est presque certainement en dehors de l'instruction LINQ: si sum est un entier, une conversion explicite est nécessaire. Déclarer sum en décimal ou insérer une conversion explicite résoudrait le problème:
// Site Collection Storage Used (GB)
sum = (int)doc.DocumentNode.SelectSingleNode("//table")
// The sum will be of the row elements
.Elements("tr")
// Skip this many rows from the top
.Skip(1)
// .ElementAt(2) = third column
// .Last() = last column
.Sum(tr => decimal.Parse(tr.Elements("td").ElementAt(3).InnerText));
Console.WriteLine("Site Collection Storage Used (GB): " + sum);
Voici un lien vers une démonstration rapide sur ideone (il est impossible d'utiliser le pack d'agilité HTML sur ideone, j'ai donc copié vos données dans un tableau de chaînes).