C# 解析文件名,插入到SQL
多亏了CodePoter,我现在正在使用这段代码解析目录中的所有.txt文件,并将它们存储在数据库中。不过我需要更多的帮助。。。文件名为R303717COMP_148A2075_20100520.txt(每个文件的中间部分是唯一的)。我想在代码中添加一些东西,以便它能够解析出R303717COMP,并将其放在数据库的左栏中,例如:(这不是我们唯一的R编号) 最后,我想让它将每个完整的文件名存储到另一个检查的表中,这样它就不会被处理两次。。感谢您的帮助C# 解析文件名,插入到SQL,c#,C#,多亏了CodePoter,我现在正在使用这段代码解析目录中的所有.txt文件,并将它们存储在数据库中。不过我需要更多的帮助。。。文件名为R303717COMP_148A2075_20100520.txt(每个文件的中间部分是唯一的)。我想在代码中添加一些东西,以便它能够解析出R303717COMP,并将其放在数据库的左栏中,例如:(这不是我们唯一的R编号) 最后,我想让它将每个完整的文件名存储到另一个检查的表中,这样它就不会被处理两次。。感谢您的帮助 using System; using S
using System;
using System.Data;
using System.Data.SQLite;
using System.IO;
namespace CSVImport
{
internal class Program
{
private static void Main(string[] args)
{
using (SQLiteConnection con = new SQLiteConnection("data source=data.db3"))
{
if (!File.Exists("data.db3"))
{
con.Open();
using (SQLiteCommand cmd = con.CreateCommand())
{
cmd.CommandText =
@"
CREATE TABLE [Import] (
[RowId] integer PRIMARY KEY AUTOINCREMENT NOT NULL,
[FeatType] varchar,
[FeatName] varchar,
[Value] varchar,
[Actual] decimal,
[Nominal] decimal,
[Dev] decimal,
[TolMin] decimal,
[TolPlus] decimal,
[OutOfTol] decimal,
[Comment] nvarchar);";
cmd.ExecuteNonQuery();
}
con.Close();
}
con.Open();
using (SQLiteCommand insertCommand = con.CreateCommand())
{
insertCommand.CommandText =
@"
INSERT INTO Import (FeatType, FeatName, Value, Actual, Nominal, Dev, TolMin, TolPlus, OutOfTol, Comment)
VALUES (@FeatType, @FeatName, @Value, @Actual, @Nominal, @Dev, @TolMin, @TolPlus, @OutOfTol, @Comment);";
insertCommand.Parameters.Add(new SQLiteParameter("@FeatType", DbType.String));
insertCommand.Parameters.Add(new SQLiteParameter("@FeatName", DbType.String));
insertCommand.Parameters.Add(new SQLiteParameter("@Value", DbType.String));
insertCommand.Parameters.Add(new SQLiteParameter("@Actual", DbType.Decimal));
insertCommand.Parameters.Add(new SQLiteParameter("@Nominal", DbType.Decimal));
insertCommand.Parameters.Add(new SQLiteParameter("@Dev", DbType.Decimal));
insertCommand.Parameters.Add(new SQLiteParameter("@TolMin", DbType.Decimal));
insertCommand.Parameters.Add(new SQLiteParameter("@TolPlus", DbType.Decimal));
insertCommand.Parameters.Add(new SQLiteParameter("@OutOfTol", DbType.Decimal));
insertCommand.Parameters.Add(new SQLiteParameter("@Comment", DbType.String));
string[] files = Directory.GetFiles(Environment.CurrentDirectory, "TextFile*.*");
foreach (string file in files)
{
string[] lines = File.ReadAllLines(file);
bool parse = false;
foreach (string tmpLine in lines)
{
string line = tmpLine.Trim();
if (!parse && line.StartsWith("Feat. Type,"))
{
parse = true;
continue;
}
if (!parse || string.IsNullOrEmpty(line))
{
continue;
}
foreach (SQLiteParameter parameter in insertCommand.Parameters)
{
parameter.Value = null;
}
string[] values = line.Split(new[] {','});
for (int i = 0; i < values.Length - 1; i++)
{
SQLiteParameter param = insertCommand.Parameters[i];
if (param.DbType == DbType.Decimal)
{
decimal value;
param.Value = decimal.TryParse(values[i], out value) ? value : 0;
}
else
{
param.Value = values[i];
}
}
insertCommand.ExecuteNonQuery();
}
}
}
con.Close();
}
}
}
}
如果模式始终为xxxxx_anythingelse.txt,则可以使用以下命令解析出xxx:
strFileName.Substring(0,strFileName.IndexOf("_"));
以下是给定文件名的方法,用于获取“\ux”之前的第一部分 然后你可以把它放在任何你想放的地方
strFileName.Split('_').First()
在名称空间中使用System.LINQ…这将起到作用….好的,我尝试了这个。。。字符串RNumber=Regex.Match(文件名@“(R.*.*.\.txt”).Groups[1]。值;添加(新的SQLiteParameter(“@FileName”,RNumber));insertCommand.CommandText=@“插入文件(文件名)值(@FileName)但不允许…”数据库只是用文件本身的随机字填充该列。有帮助吗?数据库不会“用文件本身的随机字填充该列”“,您正在通过解析错误的内容(即文件内容而不是文件名)向数据库中插入随机词。字符串RNumber=Regex.Match(filename,@”(R.*)_..\.txt”)。组[1]。值;解析文件名?我想我不明白你的意思?谢谢你的帮助!这将返回文件名开头带有r的部分,如果需要整个文件名,则只需输入文件名即可。我以为您希望r-number本身和整个文件名将其放在db.Regex.Match(filename,@“(r.*.*.\.txt”).Groups[1]的特定部分中;将解析变量“filename”中的任何字符串,如果要插入到数据库中的是“文本文件中的随机词”,那么这就是变量filename中的内容。问题不在于您在更新下面发布的代码,而在于代码设置文件名值的原因。这很有意义,我需要将我使用的变量与Directory.GetFiles方法一起放在“filename”的位置。我试图使用\\mynetwrok\位置来代替它:)谢谢
strFileName.Substring(0,strFileName.IndexOf("_"));
string RNumber = Regex.Match(filename, @"(R.*)_.*_\.txt").Groups[1].Value;
strFileName.Split('_').First()