2010-05-24 83 views
0

感谢Code Poet,我现在正在使用此代码解析目录中的所有.txt文件并将它们存储在数据库中。我需要更多的帮助,尽管...文件名是R303717COMP_148A2075_20100520.txt(中间部分每个文件都是唯一的)。我想添加一些代码,以便它能够解析出R303717COMP,并将该数据库的如左栏:(这不是我们唯一的R个)解析文件名,插入到SQL

R303717COMP data data data 
R303717COMP data data data 
R303717COMP data data data 
etc 

最后,我想要它将每个完整的文件名存储到另一个表中进行检查,以便它不会得到处理两次..任何帮助表示赞赏。

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(); 
      } 
     } 
    } 
} 

更新: 我想这一点,下面的建议,但没有去..在数据库列刚刚从文本文件随机填充的话。

string RNumber = Regex.Match(filename, @"(R.*)_.*_\.txt").Groups[1].Value; 
insertCommand.Parameters.Add(new SQLiteParameter("@FileName", RNumber)); 
insertCommand.CommandText = @" INSERT INTO Files (FileName) VALUES (@Filename) 
+0

Regex.Match(文件名,@ “(R *)_ * _ \。TXT” ).Groups [1]。价值;将解析变量“filename”中的任何字符串,如果插入到数据库中的是“来自文本文件的随机单词”,那么变量文件名就是这样。问题不在于您更新后发​​布的代码,而是代码设置文件名的值。 – 2010-05-24 21:23:37

+0

这是有道理的,我需要把我和用Directory.GetFiles方法代替'文件名'的变量。我正在尝试使用\\ mynetwrok \位置代替它.. :)谢谢! – 2010-05-24 21:38:41

回答

1

如果图案总是xxxxx_anythingelse.txt,那么你可以解析出与XXX:

strFileName.Substring(0,strFileName.IndexOf("_")); 
0

这里的“_”之前给出的文件名,以获得第一部分的方式。

string RNumber = Regex.Match(filename, @"(R.*)_.*_\.txt").Groups[1].Value; 

然后你可以把它放在任何你想放的地方。在命名空间

+0

好的,我试过这个... string RNumber = Regex.Match(filename,@“(R。*)_。* _ \。txt”)。Groups [1] .Value; insertCommand.Parameters.Add(new SQLiteParameter(“@ FileName”,RNumber)); insertCommand.CommandText = @” INSERT INTO文件(文件名) VALUES(@FileName) 但没有去....数据库刚好充满了从文件本身。任何帮助,随机单词列? – 2010-05-24 18:39:01

+0

数据库不会“只是用文件中的随机单词填充该列”,而是通过解析错误的东西(即文件内容而不是文件名)将随机单词插入到数据库中 – 2010-05-24 18:56:42

+0

不包含字符串RNumber = Regex.Match(文件名,@“(R。*)_。* _ \。txt”)。Groups [1] .Value;解析文件名?我想我不明白您的意思?感谢您的帮助! – 2010-05-24 19:02:57

0
strFileName.Split('_').First() 

使用System.Linq的......这将这样的伎俩....