【问题标题】:Export data to text file with fixed length records将数据导出到具有固定长度记录的文本文件
【发布时间】:2017-10-27 03:35:05
【问题描述】:

我正在使用 MYSQL、WinForms 和 c#

当我接下来从我的数据库中获取数据并导出到文本文件时,我有一个要求,但是无论数据库带来什么信息,每个条目都需要具有特定的长度 - 其中数据少于所需的总量,为空空格将跟随它。

例如,名字可以带入 Sam 或 Samatha,但我需要导出长度为 8 个字符
“山姆”(共 8 个字符) “Samatha”(共 8 个字符)

这是我正在使用的功能 - 任何帮助将不胜感激

public MySqlDataReader RunQueryTextFile(string query, string s1,string pathName)
{
    MySqlConnection conDataBase = new MySqlConnection(connString);
    MySqlCommand cmdDatabase = new MySqlCommand(query, conDataBase);
    MySqlDataReader myReader;
    StreamWriter sw = new StreamWriter(@pathName);
    conDataBase.Open();

    myReader = cmdDatabase.ExecuteReader();
    while (myReader.Read())
    { 
        sw.WriteLine (myReader[s1].ToString());
    }

    sw.Close();
    conDataBase.Close();
    return myReader;
}

【问题讨论】:

标签: c# mysql winforms


【解决方案1】:

使用 PadRight

int totalLength = 8;
myString.PadRight(totalLength, " ").

【讨论】:

  • 无论数据库带来什么信息,每个条目都需要有特定的长度 - 您的代码不符合此要求。
  • @jdphenix 我认为它符合要求,这正是 op 需要的。
  • @imlokesh 如果字符串必须是特定长度,例如 8,则 "Christopher".PadRight(8) 返回自身,长度为 11 个字符。
  • @jdphenix 我同意,但是您可以指出问题所在,而不是投票,因为即使您意识到使用“myString.Substring(0, 8)”也可以轻松解决问题
  • 那是我需要帮助的部分:) - 上面的 padRight 答案成功了。谢谢i3lai3la,您为我节省了很多时间。我唯一需要做的就是使用声明一个 Char 并使用它而不是仅仅使用 "" 。再次感谢 i3lai3la
【解决方案2】:

您尝试编写程序代码。思考对象。我会做这样的事情

// create enum - how to pad
public enum PadStyle    
{
    Right
    Left
}
// create attribute class
public class PaddingAttribute : Attribute
{
     public int TotalLen {get;set;}
     public PadStyle Style {get;set;}
     public char PadChar {get;set;}
     public int Order {get;set;}
}


// Create class record base - this one knows how to get properties, read attributes and pad values into one string
public class RecordBase
{
     protected string CreateRecordProtected()
     {
         // here you 
         // 1 - use reflection to get properties
         // 2 - use reflection to read PaddingAttribute from properties
         // 3 - pad property values using data in PaddingAttribute
         // 4 - concatenate record 
         // something like
         var result = o.GetPropeties().Where(...).Select(...padding logic...);
         return string.Join("", result);
         // padding logic = string.PadRight or string.PadLeft
     }
}

Read here how to deal with attribute classes

// Create class record - this one corresponds to your DB
public class Record : RecordBase
{
     private const string _fn_FiedName = "firstName";
     private const string _ln_FiedName = "lastName";

     public Record(IDataReader r)
     {
         FirstName = r[_fn_FiedName];
         LastName = r[_ln_FiedName];
     }

     [Padding(TotalLen = 15, Style = PadStyle.Right, PadChar = " ",  Order = 1)]
     public string FirstName{get;set;}
     [Padding(TotalLen = 20, Style = PadStyle.Right, PadChar = " ",  Order = 2)]
     public string LastName {get;set;}

     public override string ToString()
     {
         return base.CreateRecordProtected();
     }

现在,你的代码带有一些模组

var recList = new List<Record>();
using (var conn = new MySqlConnection(connString))
{
    using (var cmd = new MySqlCommand(query, conn))
    {
        conn.Open();
        using (var reader = cmdDatabase.ExecuteReader())
        {
            while (reader.Read())
            { 
                recList.Add(new Record(reader));
            }
        }
    }
    conn.Close();
} 

if (!recList.Any()) // System.Linq
    return;
IEnumerable<string> textFileRecords = recList.Select(x => x.ToString());
File.WriteAllLines(pathName, textFileRecords); // System.IO

现在,您有了一些不错的可重用代码。 注意:如果数据量很大,可以直接在while中追加

var rec = new Record(reader);
rec.ToString() // append this

【讨论】:

  • 非常详细的答案,非常感谢您的时间:)
  • 如果明天你的记录格式发生变化你会怎么做?此代码将使更改变得容易
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
相关资源
最近更新 更多