【问题标题】:Parse string into multiple variables将字符串解析为多个变量
【发布时间】:2015-03-19 04:56:11
【问题描述】:

我正在开发一个应用程序,它从特定目录中提取所有文件名的列表,然后需要将文件名解析为多个变量,然后提交到数据库。

如何将字符串文件名解析成多个变量?

EX 文件:

2014_31_12_09_36AM_15555555555_108

2014_31_12_09_39AM_108_15555555555

2014_31_12_09_17AM_102_108

文件名包含年、日、月、小时、分钟(带 AM/PM)和 3 位或 11 位数字,后跟另一个 3 或 11 位数字

扫描完目录后,所有文件名都存储在一个数组中。

private void ParseFileNames()
    {
        string Year = "";
        string Day = "";
        string Month = "";
        string Hour = "";
        string Minute = "";
        string Called = "";
        string Calling = "";

        //Loop through scanned file names and parse them one at a time.
        for (int i = 0; i < fileNames.Length; i++)
        {
            string[] parsedFileName = fileNames[i].Split('_');
            Year = parsedFileName[0];
            Day = parsedFileName[1];
            Month = parsedFileName[2];
            Hour = parsedFileName[3];
            Minute = parsedFileName[4];
            Called = parsedFileName[5];
            Calling = parsedFileName[6];

            //open DB connection and submit each individual parsed file data into DB

            //Move file from toIndexPath to IndexedPath
        }
    }

有没有更好的方法来做到这一点?

【问题讨论】:

  • “更好”如何?能够处理格式错误的名称吗?将日期存储为日期而不是字符串?使用更少的字符?
  • 我打算将日期转换为日期而不是字符串,以及时间(与日期分开?),以便可以搜索它们。

标签: c# mysql arrays string parsing


【解决方案1】:

有没有更好的方法来做到这一点?

“更好”是相当主观的。总有更好的方法取决于你想要什么。在你的情况下,我根本不会编写代码来解析你的文件名,而且你会进行很多往返来一次填充你的表一行。

我会改为使用批量加载命令,例如:LOAD DATA ... INTO TABLE ... LINES TERMINATED BY '\r\n' FIELDS TERMINATED BY '_'

【讨论】:

    【解决方案2】:

    这段代码更短,我不知道更好,但至少你得到一个日期时间

        //This code is just for testing the strings,  delete these 4 after testing.
        var stringList = new List<string>();
        stringList.Add("2014_31_12_09_36AM_15555555555_108");
        stringList.Add("2014_31_12_09_39AM_108_15555555555");
        stringList.Add("2014_31_12_09_17AM_102_108");
    
        var allFileDate = new List<FileData>();
        foreach (var item in stringList)
        {
            var dt = item.Split('_');
            var timeCombined = string.Concat(dt[2], "/", dt[1],"/", dt[0]," ", dt[3], ":", dt[4]);
            allFileDate.Add(new FileData {Date = Convert.ToDateTime(timeCombined), Called = dt[5], Calling = dt[6]});
        }
    

    还有你的班级

        public class FileData
        {
            public DateTime Date { get; set; }
            public string Called { get; set; }
            public string Calling { get; set; }    
        }
    

    所有数据验证都在那里,没关系。

    【讨论】:

      【解决方案3】:

      你可以像这样返回一个类

      public class FileData
      {
          public int Year {get;set;}
          public int Day  {get;set;}
          public int Month  {get;set;}
          public int Hour  {get;set;}
          public int Minute  {get;set;}
          public int Called  {get;set;}
          public int Calling  {get;set;}
      
          public FileData(string[] parsedInfo)
          {
              Year = Convert.ToInt32(parsedInfo[0]);
              // and so on with other member to load
          }
      }
      

      然后只需调用以下命令即可获得List&lt;FileData&gt;

      var listFileData = fileNames.Select(fn=> new FileData(fn.Split('_'))).ToList();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-06
        • 2019-07-24
        • 2014-03-02
        相关资源
        最近更新 更多