如何更改 C# 文本文件中的未知数字?
Posted
技术标签:
【中文标题】如何更改 C# 文本文件中的未知数字?【英文标题】:How to change an unknown number in a text file for C#? 【发布时间】:2018-02-09 17:54:43 【问题描述】:我正在尝试为我的 Discord 服务器的机器人创建一个“警告系统”,当使用该命令时,它会从文本文件中提取信息,然后对其进行更新。我可以在一定程度上设想我想要一步一步发生的事情,但我对如何提取将从文件中读取的内容作为示例感到困惑:
鲍勃#5368 3 标记#8459 6 辛迪#1254 2
我只想更改名称后面的数字,我不太确定如何基本上找到我正在寻找的用户,然后拉数字并将其设置为“totalWarn”,将其添加( totalWarn =+ warnNum),然后用新号码更新该用户。
注意:“warningFile”是已在此代码块之外定义的文件路径。
public async Task warn(IGuildUser user, int warnNum, [Remainder] string reason)
int totalWarn = 0;
if (user == null)
await ReplyAsync("Please include a name");
if (warnNum <= 0)
await ReplyAsync("The warning level must increase by 1 or more.");
if (reason == null)
await ReplyAsync("Please include a reason.");
string nickName = user.Username;
//Check for whether text file exists or not.
if (!File.Exists(warningFile))
//Create the File
FileStream fs = File.Create(warningFile);
//Reads all the text in the file and puts it into an array.
string[] arr = File.ReadAllLines(warningFile);
for (int i = 0; i < arr.Length; i++)
string line = arr[i];
totalWarn = +warnNum;
await Context.Channel.SendMessageAsync($"user.Username's warning level has increased by warnNum for reason.\n"
+ $"Your warning level is now totalWarn. Please take this time to review the server rules.");
我不是在找人来帮我完成它,只是因为我完全迷失了方向,所以可以帮助自己朝着正确的方向前进,而有关更改文本的信息也不是很有帮助。
【问题讨论】:
user.Username
属性是否只返回名称?您需要拥有整个标识符才能在文件中获取实际用户
那么有什么问题呢?您需要解析“bob#5368 3”字符串的帮助吗?
您可能希望为此使用数据库。使用您的方法,您必须阅读 all 文本文件的行(当您只需要一个时)。然后你必须解析文本行,找到你想要的数字,把那个数字解析成一个int
然后添加到那个int
,然后重写整个文件。而数据库的工作量要少得多,而且速度要快得多
仅供参考,如果文件不存在,您将收到异常,因为您在创建新文件后没有关闭FileStream fs
,然后您尝试在下一个文件中读取该文件线。为了解决这个问题,你可以把它放在using
中,它会自动关闭并处理它:using (File.Create(warningFile))
(最好)或者在你创建它之后关闭它:File.Create(warningFile).Close();
我没想到所有这些 cmets 这么快。 user.Username 提取了他们在 Discord 中的当前昵称,我不太确定如何将标识符更改为字符串。我一定会检查数据库方法。我对此类事情的经验为零,因此我不确定将其合并到不和谐机器人中会有多容易。至于文件关闭,注明。忘记写了。现在固定在我的实际程序上。
【参考方案1】:
以下是如何使用正则表达式解析文件中的一行:
void Main()
string line = "bob#5368 3";
GuildUser user = new GuildUser( line );
user.Warnings++;
user.ToString().Dump();
public class GuildUser
public string Name get; set;
public int Id get; set;
public int Warnings get; set;
public GuildUser( string line )
Match match = Regex.Match( line, @"(.+)?#(\d+) (\d+)" );
if ( !match.Success ) throw new Exception( "Couldn't parse line: " + line );
Name = match.Groups[1].Value;
Id = int.Parse( match.Groups[2].Value );
Warnings = int.Parse( match.Groups[3].Value );
public override string ToString()
return $"Name#Id Warnings";
您可以使用 File.ReadAllLines、File.WriteAllLines。
我可能也会使用一些 linq。
我更新为添加“ToString”方法来重写该行。 然后,您可以添加警告并获取调用 ToString() 的新字符串。
【讨论】:
【参考方案2】:另一种方式:
public static void stuff()
string name = "bob";
string firstNumber = "";
string secondNumber = "";
int lineIndex = 0;
List<string> lines = new List<string>(File.ReadAllLines(@"C:\Text.txt"));
foreach(string line in lines)
if(line.Contains(name))
lineIndex = lines.IndexOf(line);
string[] parts = line.Split('#');
name = parts[0];
firstNumber = parts[1].Split(' ')[0];
secondNumber = parts[1].Split(' ')[1];
firstNumber = (Convert.ToInt32(firstNumber) + 1).ToString();
/*
* instert code here for changing the number you want to change
*/
lines[lineIndex] = name + "#" + firstNumber + " " + secondNumber;
File.WriteAllLines(@"C:\Text.txt",lines.ToArray());
break;
【讨论】:
以上是关于如何更改 C# 文本文件中的未知数字?的主要内容,如果未能解决你的问题,请参考以下文章