来自具有特定值的文本文件的 C# 数组
C# array from text files with specific values
我有一个名为 failas.txt 的文件。它包含立陶宛语文本。我为它编码了 1257,所以它可以读取立陶宛字母。
现在我要做的就是为该文件中使用的每个立陶宛字母创建一个数组。
所有这些字母都在字符串 p = "AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ";
中
数组应显示文本中每个字母重复的次数,并将这些结果写入名为 rezultatai.txt 的新 txt 文件。所以代码是这样的:
using System;
using System.Linq;
using System.Globalization;
using System.Collections.Generic;
using System.Collections;
using System.IO; skirta biblioteka
using System.Text;
using System.Threading;
class Program
{
static void Main()
{
string failas = "failas.txt";
string rodymas = File.ReadAllText(failas, Encoding.GetEncoding(1257));
Console.OutputEncoding = Encoding.UTF8;
Console.WriteLine(rodymas);
char[] masyvas = rodymas.Where(Char.IsLetter).OrderBy(Char.ToLower).ToArray();
foreach (char c in masyvas)
{
Console.Write(c + ",");
}
string p = "AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ";
failas = failas.ToUpper();
Dictionary<char, int> dict = new Dictionary<char, int>();
foreach (char c in p) dict.Add(c, 0);
foreach (char c in failas)
{
int val;
if (dict.TryGetValue(c, out val)) dict[c] = val + 1;
}
//write to a file..
foreach (KeyValuePair<char, int> item in dict)
{
if (item.Value > 0) Console.WriteLine("Character {0}, No of Occurences = {1}", item.Key, item.Value);
File.AppendAllText("rezultatai.txt", item.Value + Environment.NewLine);
}
Console.WriteLine("Sum = {0}", dict.Sum(x => x.Value));
Console.ReadKey();
然而,不知何故 returns 只输出字母 A、F、I、L、S、T。像这样:
Character A, No of Occurences = 2
Character F, No of Occurences = 1
Character I, No of Occurences = 1
Character L, No of Occurences = 1
Character S, No of Occurences = 1
Character T, No of Occurences = 2
正如我之前提到的,字母应该是:
AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ
此外,当我打开 rezultatai.txt 文件检查附加值时,它只包含一长列数字:
2
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
1
0
0
0
0
0
1
0
2
0
0
0
0
0
0
2
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
1
0
0
0
0
0
1
0
2
0
However, somehow it returns only output with letters A, F, I, L, S, T. Like this:
foreach (char c in failas)
您遍历 文件名,即 "failas.txt"
,这应该是实际文件的文本。
foreach (char c in rodymas)
foreach (char c in masyvas) // Possibly the char array.. not sure which..
Also, when I open rezultatai.txt file to check appended values, it only contains a long column of numbers:
是的,您附加了 KeyValuePair
中的值,其中值是一个整数,这大概需要与您输出到控制台的值相同。
.NET 具有非常强大的功能,如 LINQ 和 CultureInfo 系统。您可以在几行中使用两者来完成此操作:
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
internal class Program
{
private static void Main()
{
var cultureLithunia = new CultureInfo("lt-LT");
var textInfoLithunia = cultureLithunia.TextInfo;
string requested = textInfoLithunia.ToUpper("AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ");
string content = File.ReadAllText("failas.txt", Encoding.GetEncoding(textInfoLithunia.ANSICodePage));
var characters = content.GroupBy(c => c);
var charactersYouWant = characters.Where(c => requested.Contains(textInfoLithunia.ToUpper(c.Key)));
var linesYouWantToOutput = charactersYouWant.Select(c => string.Format("Character {0}, No of Occurences = {1}", c.Key, c.Count()));
File.WriteAllLines("rezultatai.txt", linesYouWantToOutput);
Console.WriteLine("Done");
Console.ReadKey();
}
}
如果你想要所需文本中的所有字符,那就有点复杂了:
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
internal class Program
{
private static void Main()
{
var cultureLithunia = new CultureInfo("lt-LT");
var textInfoLithunia = cultureLithunia.TextInfo;
string requested = textInfoLithunia.ToUpper("AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ");
string content = File.ReadAllText("failas.txt", Encoding.GetEncoding(textInfoLithunia.ANSICodePage));
var characters = content.GroupBy(c => c);
var charactersYouWant = requested.Select(c => new { Key = c, Count = characters.Where(cc => textInfoLithunia.ToUpper(cc.Key) == c).Select(group => group.Count()).FirstOrDefault() });
var linesYouWantToOutput = charactersYouWant.Select(c => string.Format("Character {0}, No of Occurences = {1}", c.Key, c.Count));
File.WriteAllLines("rezultatai.txt", linesYouWantToOutput);
Console.WriteLine("Done");
Console.ReadKey();
}
}
我有一个名为 failas.txt 的文件。它包含立陶宛语文本。我为它编码了 1257,所以它可以读取立陶宛字母。
现在我要做的就是为该文件中使用的每个立陶宛字母创建一个数组。
所有这些字母都在字符串 p = "AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ";
数组应显示文本中每个字母重复的次数,并将这些结果写入名为 rezultatai.txt 的新 txt 文件。所以代码是这样的:
using System;
using System.Linq;
using System.Globalization;
using System.Collections.Generic;
using System.Collections;
using System.IO; skirta biblioteka
using System.Text;
using System.Threading;
class Program
{
static void Main()
{
string failas = "failas.txt";
string rodymas = File.ReadAllText(failas, Encoding.GetEncoding(1257));
Console.OutputEncoding = Encoding.UTF8;
Console.WriteLine(rodymas);
char[] masyvas = rodymas.Where(Char.IsLetter).OrderBy(Char.ToLower).ToArray();
foreach (char c in masyvas)
{
Console.Write(c + ",");
}
string p = "AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ";
failas = failas.ToUpper();
Dictionary<char, int> dict = new Dictionary<char, int>();
foreach (char c in p) dict.Add(c, 0);
foreach (char c in failas)
{
int val;
if (dict.TryGetValue(c, out val)) dict[c] = val + 1;
}
//write to a file..
foreach (KeyValuePair<char, int> item in dict)
{
if (item.Value > 0) Console.WriteLine("Character {0}, No of Occurences = {1}", item.Key, item.Value);
File.AppendAllText("rezultatai.txt", item.Value + Environment.NewLine);
}
Console.WriteLine("Sum = {0}", dict.Sum(x => x.Value));
Console.ReadKey();
然而,不知何故 returns 只输出字母 A、F、I、L、S、T。像这样:
Character A, No of Occurences = 2
Character F, No of Occurences = 1
Character I, No of Occurences = 1
Character L, No of Occurences = 1
Character S, No of Occurences = 1
Character T, No of Occurences = 2
正如我之前提到的,字母应该是:
AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ
此外,当我打开 rezultatai.txt 文件检查附加值时,它只包含一长列数字:
2
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
1
0
0
0
0
0
1
0
2
0
0
0
0
0
0
2
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
1
0
0
0
0
0
1
0
2
0
However, somehow it returns only output with letters A, F, I, L, S, T. Like this:
foreach (char c in failas)
您遍历 文件名,即 "failas.txt"
,这应该是实际文件的文本。
foreach (char c in rodymas)
foreach (char c in masyvas) // Possibly the char array.. not sure which..
Also, when I open rezultatai.txt file to check appended values, it only contains a long column of numbers:
是的,您附加了 KeyValuePair
中的值,其中值是一个整数,这大概需要与您输出到控制台的值相同。
.NET 具有非常强大的功能,如 LINQ 和 CultureInfo 系统。您可以在几行中使用两者来完成此操作:
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
internal class Program
{
private static void Main()
{
var cultureLithunia = new CultureInfo("lt-LT");
var textInfoLithunia = cultureLithunia.TextInfo;
string requested = textInfoLithunia.ToUpper("AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ");
string content = File.ReadAllText("failas.txt", Encoding.GetEncoding(textInfoLithunia.ANSICodePage));
var characters = content.GroupBy(c => c);
var charactersYouWant = characters.Where(c => requested.Contains(textInfoLithunia.ToUpper(c.Key)));
var linesYouWantToOutput = charactersYouWant.Select(c => string.Format("Character {0}, No of Occurences = {1}", c.Key, c.Count()));
File.WriteAllLines("rezultatai.txt", linesYouWantToOutput);
Console.WriteLine("Done");
Console.ReadKey();
}
}
如果你想要所需文本中的所有字符,那就有点复杂了:
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
internal class Program
{
private static void Main()
{
var cultureLithunia = new CultureInfo("lt-LT");
var textInfoLithunia = cultureLithunia.TextInfo;
string requested = textInfoLithunia.ToUpper("AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ");
string content = File.ReadAllText("failas.txt", Encoding.GetEncoding(textInfoLithunia.ANSICodePage));
var characters = content.GroupBy(c => c);
var charactersYouWant = requested.Select(c => new { Key = c, Count = characters.Where(cc => textInfoLithunia.ToUpper(cc.Key) == c).Select(group => group.Count()).FirstOrDefault() });
var linesYouWantToOutput = charactersYouWant.Select(c => string.Format("Character {0}, No of Occurences = {1}", c.Key, c.Count));
File.WriteAllLines("rezultatai.txt", linesYouWantToOutput);
Console.WriteLine("Done");
Console.ReadKey();
}
}