Vinodh Muthusamy Ответов: 3

Как написать текстовый файл с фиксированной длиной на языке Си#


мне нужно записать данные в файл в указанной позиции с фиксированной длиной для каждого столбца с начальной позицией,конечной позицией и длиной столбца. не могли бы вы, пожалуйста, изменить мой код или предложить.Я дал длину выборки для каждого столбца

Column	startposition  endposotion  Length
     1		1	        9	         9	
     2		10	       20	         10
     3		21          29           8
     4      30          31           1
     5		32	        42          10





Вывод мне нужно было записать в текстовый файл как:

00000	  2014-09-23 01:36:22 F	2014-09-23
000000	  2014-09-23 01:36:22 F	2014-09-23
000000000 2014-09-23 01:36:22 F	2014-09-23


ниже приведен код, который я создал

string txt = string.Empty;
DataTable employeeTable = new DataTable("Employee");
employeeTable.Rows.Add("00000", "2014-09-23", "01:36:22", "F", "2014-09-23");
employeeTable.Rows.Add("000000", "2014-09-23", "01:36:22", "F", "2014-09-23");
employeeTable.Rows.Add("000000000", "2014-09-23", "01:36:22", "F", "2014-09-23");
DataSet ds = new DataSet("Organization");
ds.Tables.Add(employeeTable);
string filepath = Application.StartupPath + "\\" + "file.txt" ;
StreamWriter sw = null;
sw = new StreamWriter(filepath, false);
foreach (DataRow row in ds.Tables[0].Rows)
{
foreach (var item in row.ItemArray)
{
//Add the Data rows.
txt += item.ToString() + "\t";
}
txt += "\r\n";
}
sw.Write(txt);
sw.Close();


Вывод, который я получаю из этого кода, есть, но это неправильно.
00000	2014-09-23	01:36:22	F	2014-09-23	
000000	2014-09-23	01:36:22	F	2014-09-23	
000000000	2014-09-23	01:36:22	F	2014-09-23


пожалуйста, исправьте мою проблему.

Что я уже пробовал:

string txt = string.Empty;
DataTable employeeTable = new DataTable("Employee");
employeeTable.Rows.Add("00000", "2014-09-23", "01:36:22", "Falseis1", "2014-09-23", "01:36:22");
employeeTable.Rows.Add("000000", "2014-09-23", "01:36:22", "F", "2014-09-23", "01:36:22");
employeeTable.Rows.Add("000000000", "2014-09-23", "01:36:22", "F", "2014-09-23", "01:36:22");
DataSet ds = new DataSet("Organization");
ds.Tables.Add(employeeTable);
string filepath = Application.StartupPath + "\\" + "file.txt" ;
StreamWriter sw = null;
sw = new StreamWriter(filepath, false);
foreach (DataRow row in ds.Tables[0].Rows)
{
foreach (var item in row.ItemArray)
{
//Add the Data rows.
txt += item.ToString() + "\t";
}
txt += "\r\n";
}
sw.Write(txt);
sw.Close();

Sinisa Hajnal

Поскольку ваши столбцы имеют разную длину, вы не можете использовать табуляцию в качестве разделителя (разделитель фиксированной длины). Вместо этого определите самый длинный текст в каждом столбце и установите этот пробел + 1 (или любое другое количество пробелов, соответствующее вашему случаю). Вам нужно заполнить все остальные строки до этой максимальной длины + пробелы, а затем объединить их.

Vinodh Muthusamy

не могли бы вы изменить мой код

Richard MacCutchan

Должно быть очевидно, что вам нужно создать каждый текстовый элемент в поле фиксированной ширины. string.Format Я помогу вам сделать это.

3 Ответов

Рейтинг:
22

OriginalGriff

После преобразования объекта в строку можно использовать методы PadLeft и PadRight для их выравнивания в строку фиксированной длины:

object o1 = "0000";
object o2 = "00000";
Console.WriteLine("\"" + o1.ToString().PadLeft(8) + "\"");
Console.WriteLine("\"" + o2.ToString().PadRight(8) + "\"");
Дать вам:
"    0000"
"00000   "
Вы можете использовать это на каждом поле, чтобы дать вам фиксированную ширину, которая вам нужна.


Vinodh Muthusamy

Но мне нужно начать с указанной начальной позиции каждого столбца

OriginalGriff

И если вы начнете с самого начала записи, и дополните каждое поле до нужной длины, как вы их пишете, это то, что вы получите...

Рейтинг:
2

alexandregpc

Вы можете использовать AGPC.FixedLayout Nuget, чтобы сделать это простым способом


CHill60

Будьте осторожны - это может быть воспринято как вождение сайта

Рейтинг:
0

Richard Deeming

Не используйте конкатенацию строк в цикле! У тебя уже есть ребенок. StreamWriter который вы можете использовать для записи каждой части строки.

И самый простой вариант для вывода фиксированной ширины-это использовать опцию выравнивания функции форматирования строк:
Составное Форматирование | Microsoft Docs[^]

using (StreamWriter sw = new StreamWriter(filepath, false))
{
    foreach (DataRow in ds.Tables[0].Rows)
    {
        writer.WriteLine("{0,-9}{1,-10}{2,-8}{3}{4,-10}", row.ItemArray);
    }
}
Выход:
00000    2014-09-2301:36:22F2014-09-23
000000   2014-09-2301:36:22F2014-09-23
0000000002014-09-2301:36:22F2014-09-23


Vinodh Muthusamy

спасибо, Ричард, звучит неплохо.

Member 13968331

что я буду делать для того, чтобы вывод был выровнен специально по знаку (*), так как когда я его вывел, он не выровнен и как сделать ту программу, в которой я буду обновлять определенную строку