Метод String.Format для выравнивания выходных данных базы данных в текстовом файле. - PullRequest
0 голосов
/ 12 апреля 2019

Я знаю, что есть некоторые другие вопросы, связанные с моими, но они не очень мне помогают.Я пытался понять концепцию метода String.Format, но мне снова и снова не удавалось, и я до сих пор не понимаю, как использовать его в моем случае.Я знаю, что об этом очень много спрашивают, но если у кого-то есть идея, как выполнить выравнивание, я был бы очень признателен.

Я сохраняю вывод различных таблиц базы данных в разные текстовые файлы.Я хочу выровнять «имя» столбца по его «значению».Это имеет большой смысл, потому что в некоторых таблицах много «нулевых» значений, что приводит к плохо отформатированному выводу.Поскольку «ноль» не экспортируется в этот файл, и поэтому значения перемещаются влево.

Database Table vs. Text File

private void WriteSQLQueryOutputToTextFile(string DBUser, string DBUserPassword, string sqlQuery, string databaseName, string nameOfOutputFile)
{
    string pathOfOutputFile = dWTestResult + "\\DatabaseUpgradeCheck\\" + nameOfOutputFile;           

    using (SqlConnection sqlCon = new SqlConnection("Data Source=" + 
    GetEnvironmentVariable.MachineName + "; Initial Catalog=" + databaseName + "; User ID=" + DBUser + "; Password=" + DBUserPassword + ";"))
    {
        SqlDataAdapter adapter = new SqlDataAdapter(sqlQuery, sqlCon);     
        try
        {
          sqlCon.Open();
          DataSet dataset = new DataSet();
          adapter.Fill(dataset, "nameOfDataset");
          string currentLine = "";
          foreach (var col in dataset.Tables[0].Columns)
          {
            currentLine += " " + col.ToString();
          }

         OutputHandler.AppendDataToFile(pathOfOutputFile, currentLine);

         foreach (DataRow row in dataset.Tables[0].Rows)
         {
            currentLine = "";
            foreach (var item in row.ItemArray)
            {
                currentLine += " " + item.ToString();
            }
            OutputHandler.AppendDataToFile(pathOfOutputFile, currentLine);
          }
     }
     catch (Exception ex)
     {
        logger.Debug(ex, "Writing Database Output to the " + "\"" + nameOfOutputFile + "\"" + " file failed");
     }
     finally
     {
        sqlCon.Close();
     }
   }
}

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

string. Формат подходит, если вы заранее знаете требуемый формат, и менее подходит, если у вас есть динамические источники, такие как результаты запроса. Попробуйте что-то вроде этого:

private void WriteSQLQueryOutputToTextFile(string DBUser, string DBUserPassword, string sqlQuery, string databaseName, string nameOfOutputFile)
{
    string pathOfOutputFile = dWTestResult + "\\DatabaseUpgradeCheck\\" + nameOfOutputFile;           

    using (SqlConnection sqlCon = new SqlConnection("Data Source=" + 
    GetEnvironmentVariable.MachineName + "; Initial Catalog=" + databaseName + "; User ID=" + DBUser + "; Password=" + DBUserPassword + ";"))
    {
        SqlDataAdapter adapter = new SqlDataAdapter(sqlQuery, sqlCon);     
        try
        {
          sqlCon.Open();
          DataSet dataset = new DataSet();
          adapter.Fill(dataset, "nameOfDataset");
          string currentLine = "";
          var nameLengths = new int[dataset.Tables[0].Columns.Count];
          var i = 0;
          foreach (var col in dataset.Tables[0].Columns)
          {
            var colName = col.ToString();
            nameLengths[i] = colName.Length;
            currentLine += " " + colName;
            i++;
          }

         OutputHandler.AppendDataToFile(pathOfOutputFile, currentLine);

         foreach (DataRow row in dataset.Tables[0].Rows)
         {
            currentLine = "";
            i = 0;
            foreach (var item in row.ItemArray)
            {
                var field = item.ToString();
                currentLine += " " + field.PadRight(nameLengths[i], ' ');
                i++;
            }
            OutputHandler.AppendDataToFile(pathOfOutputFile, currentLine);
          }
     }
     catch (Exception ex)
     {
        logger.Debug(ex, "Writing Database Output to the " + "\"" + nameOfOutputFile + "\"" + " file failed");
     }
     finally
     {
        sqlCon.Close();
     }
   }
}
0 голосов
/ 12 апреля 2019

Если вы получите длину строкового представления каждого имени столбца и значения данных, вы можете определить минимальную ширину для каждого столбца и подготовить строку формата для этого столбца, которая устанавливает его минимальную ширину.

Примерно так:

using System;
using System.Data;
using System.Linq;
using System.Text;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {

            DataTable dt = SampleData();

            // Prepare the column formats
            int nCols = dt.Columns.Count;
            var dataWidths = dt.Columns.Cast<DataColumn>().Select(x => x.ColumnName.Length).ToList();

            foreach (DataRow d in dt.Rows)
            {
                for (int i = 0; i < nCols; i++)
                {
                    dataWidths[i] = Math.Max(dataWidths[i], d.ItemArray[i].ToString().Length);
                }
            }

            var colFormats = dataWidths.Select(x => $"{{0,{-x}}}").ToList();

            //

            var sb = new StringBuilder();

            // Add the column names
            sb.AppendLine(string.Join(" ", dt.Columns.Cast<DataColumn>().Select((x, i) => string.Format(colFormats[i], x.ColumnName))));

            // Add in the data
            foreach (DataRow d in dt.Rows)
            {
                sb.AppendLine(string.Join(" ", d.ItemArray.Select((x, i) => string.Format(colFormats[i], x))));
            }

            Console.WriteLine(sb.ToString());

            Console.ReadLine();


        }

        static DataTable SampleData()
        {

            DataTable sdt = new DataTable();
            string[] cn = "ARCHIVE DBDATETIME NEXTDOCID HIGHESTDISK SYSTEMTYPE FLAGS VERSION SINGLEUSER".Split(' ');

            foreach (string n in cn)
            {
                sdt.Columns.Add(n);
            }

            DataRow drn = sdt.NewRow();
            drn["ARCHIVE"] = "Hello";
            drn["DBDATETIME"] = 1316859;
            drn["NEXTDOCID"] = 1;
            drn["HIGHESTDISK"] = "Nothing";
            drn["SYSTEMTYPE"] = 1;
            drn["FLAGS"] = "ABC";
            drn["VERSION"] = "Hello";
            drn["SINGLEUSER"] = 256;
            sdt.Rows.Add(drn);

            drn = sdt.NewRow();
            drn["ARCHIVE"] = "Value longer than header";
            // No value for drn["DBDATETIME"] etc.
            drn["SINGLEUSER"] = 256;
            sdt.Rows.Add(drn);

            return sdt;
        }

    }
}

Пример вывода:

ARCHIVE                  DBDATETIME NEXTDOCID HIGHESTDISK SYSTEMTYPE FLAGS VERSION SINGLEUSER
Hello                    1316859    1         Nothing     1          ABC   Hello   256
Value longer than header                                                           256
...