读取带有数字的文件的程序
本文关键字:文件 程序 数字 读取 | 更新日期: 2024-10-23 02:01:53
我正在编写一个程序,读取带有车型和油耗的文件。
在文件中,我有像A|12.45这样的车,其中A代表型号,数字代表每100公里的油耗。每辆车都有自己的路线。
文件如下:
A|8.11
B|14.38
C | 13.05
在这里,我们可以看到B的消耗最高,但当我在控制台中运行该程序时,它显示为1438L,中间没有点在中间。我该怎么解决这个问题?
我有一个代码,看起来像这样:
static void Main(string[] args)
{
StreamReader readF = File.OpenText(@"D:'CarList.txt");
string line = readF.ReadLine();
double highest = 0;
double lowest = 300;
string nameHighest= "";
string nameLowest= "";
while (line != null)
{
string[] temp = line.Split('|');
if (Convert.ToDouble(temp[1]) > highest)
{
highest= Convert.ToDouble(temp[1]);
nameHighest = temp[0];
}
if (Convert.ToDouble(temp[1]) < lowest)
{
lowest = Convert.ToDouble(temp[1]);
nameLowest = temp[0];
}
line = readF.ReadLine();
}
readF.Close();
Console.WriteLine("Highest consumption: " + nameHighest + ". It consumes " + highest + " L per 100Km.");
Console.WriteLine("Lowest consumption " + nameLowest + ". It consumes " + lowest + " L per 100Km");
Console.ReadKey();
}
谢谢!
我强烈怀疑这是因为您机器上的默认区域性是使用,
而不是.
作为小数分隔符的区域性。您可以使用double.Parse
并指定CultureInfo.InvariantCulture
来使用不变区域性对其进行解析,确实使用.
作为分隔符。
实际上,我会分几个步骤重写您的代码。
步骤1:使用double.Parse
,每行只使用一次-同样,每行提取一次temp[0]
。
步骤2:使用double.NegativeInfinity
作为初始"最高",使用double.PositiveInfinity
作为初始"最低",这样任何有限条目都将注册。
第三步:在末尾使用一个格式字符串。使用C#6,我们可以使用字符串插值,但至少我们可以使它比以前更简单。
步骤4:使用File.ReadLines
而不是"手动"读取
在这一点上,我们有:
using System;
using System.Globalization;
using System.IO;
class Test
{
static void Main(string[] args)
{
double highest = double.NegativeInfinity;
double lowest = double.PositiveInfinity;
string nameHighest= "";
string nameLowest= "";
foreach (var line in File.ReadLines("test.txt"))
{
string[] temp = line.Split('|');
string name = temp[0];
double consumption = double.Parse(
temp[1],
CultureInfo.InvariantCulture);
if (consumption > highest)
{
highest = consumption;
nameHighest = name;
}
if (consumption < lowest)
{
lowest = consumption;
nameLowest = name;
}
}
Console.WriteLine(
"Highest consumption: {0}. It conumes {1}L per 100km",
nameHighest, highest);
Console.WriteLine(
"Lowest consumption: {0}. It conumes {1}L per 100km",
nameLowest, lowest);
}
}
步骤5:使用LINQ将数据的读取和解析与使用数据区分开来——尽管我将所有内容都存储在一个列表中,这样我们就可以在一分钟内完成两次。。。
using System;
using System.Globalization;
using System.IO;
using System.Linq;
class Test
{
static void Main(string[] args)
{
var cars = File.ReadLines("test.txt")
.Select(line => line.Split('|'))
.Select(bits => new { Name = bits[0], Consumption = double.Parse(bits[1]) })
.ToList();
if (cars.Count == 0)
{
Console.WriteLine("No cars!");
return;
}
var highest = cars[0];
var lowest = cars[0];
foreach (var car in cars.Skip(1))
{
if (car.Consumption > highest.Consumption)
{
highest = car;
}
if (car.Consumption < lowest.Consumption)
{
lowest = car;
}
}
Console.WriteLine(
"Highest consumption: {0}. It consumes {1}L per 100km",
highest.Name, highest.Consumption);
Console.WriteLine(
"Lowest consumption: {0}. It consumes {1}L per 100km",
lowest.Name, lowest.Consumption);
}
}
步骤6:使用MoreLINQ的MinBy
和MaxBy
使其变得非常简单:
using MoreLinq;
using System;
using System.Globalization;
using System.IO;
using System.Linq;
class Test
{
static void Main(string[] args)
{
var cars = File.ReadLines("test.txt")
.Select(line => line.Split('|'))
.Select(bits => new { Name = bits[0], Consumption = double.Parse(bits[1]) })
.ToList();
if (cars.Count == 0)
{
Console.WriteLine("No cars!");
return;
}
var highest = cars.MaxBy(c => c.Consumption);
var lowest = cars.MinBy(c => c.Consumption);
Console.WriteLine(
"Highest consumption: {0}. It consumes {1}L per 100km",
highest.Name, highest.Consumption);
Console.WriteLine(
"Lowest consumption: {0}. It consumes {1}L per 100km",
lowest.Name, lowest.Consumption);
}
}