#c# #datatable
#c# #datatable
Вопрос:
У меня есть такая таблица данных:
TerminalNo Payment ORNO Time
PHW0501 1,000.00 1 1:05pm
PHW0502 2,000.00 2 1:05pm
PHW0501 3,000.00 3 1:10pm
PHW0502 4,000.00 4 1:10pm
PHW0501 5,000.00 5 1:15pm
PHW0502 6,000.00 6 1:15pm
PHW0501 7,000.00 7 1:20pm
PHW0502 8,000.00 8 1:20pm
Каждый раз, когда платеж производился на обоих терминалах (одновременно
или нет), я хочу получить оплату как за терминально, так и
запишите его в другой текстовый файл с другим путем к папке.
Вот так:
FolderPath1/Txt1
PHW0501, 1,000.00, 1:05pm, 1
FolderPath2/Txt2
PHW0502, 2,000.00, 1:05pm, 2
Я получаю только это:
Folder1/Txt1 = PHW0501, 1,000.00, 1:05pm, 1
Это мой код:
DataRow rw = dtTransaction.AsEnumerable().FirstOrDefault(tt => tt.Field<string>("TerminalNo") == "PHW0501");
DataRow rw2 = dtTransaction.AsEnumerable().FirstOrDefault(tt => tt.Field<string>("TerminalNo") == "PHW0502");
string fileName1 = GeneratedPath1 DateTime.Now.ToString("MMddyyyy") ".txt";
string fileName2 = GeneratedPath2 DateTime.Now.ToString("MMddyyyy") ".txt";
for (int i = 0; i < dtTransaction.Rows.Count; i )
{
if (rw.ItemArray[4].ToString().Equals("PHW0501"))
{
if (dtTransaction.Rows[i]["TerminalNo"].ToString().Equals("PHW0501") amp;amp; !dtTransaction.Rows[i]["ORNo"].ToString().Equals(""))
{
string Time = dtTransaction.Rows[i]["Time"];
double Payment = -double.Parse(dtTransaction.Rows[i]["Payment"].ToString());
int ORNo = dtTransaction.Rows[i]["ORNo"].ToString();
using (StreamWriter sw = File.AppendText(fileName1))
{
sw.Write("PHW0501" ",");
sw.Write(Payment ",");
sw.Write(Time ",");
sw.Write(ORNo);
}
}
}
if (rw2.ItemArray[4].ToString().Equals("PHW0502"))
{
if (dtTransaction.Rows[i]["TerminalNo"].ToString().Equals("PHW0502") amp;amp; !dtTransaction.Rows[i]["ORNo"].ToString().Equals(""))
{
string Time = dtTransaction.Rows[i]["Time"];
double Payment = double.Parse(dtTransaction.Rows[i]["Payment"].ToString());
int ORNo = dtTransaction.Rows[i]["ORNo"].ToString();
using (StreamWriter sw = File.AppendText(fileName2))
{
sw.Write("PHW0502" ",");
sw.Write(Payment ",");
sw.Write(Time ",");
sw.Write(ORNo);
}
}
}
}
Комментарии:
1. Почему вы публикуете некомпилируемый код?
int ORNo = dtTransaction.Rows[i]["ORNo"].ToString();
2. Какие типы столбцов есть в вашей таблице данных? Все это строки? Почему?
3.
double Payment
— Какой позор! Вы только что потеряли немного денег. Для работы с деньгами используйтеdecimal
тип.4. Для имени файла / каталога лучше использовать
yyyyMMdd
формат. Это позволит вам легко сортировать их по дате.5. Спасибо за советы @AlexanderPetrov
Ответ №1:
Используйте LINQ для группировки.
var grouped = dtTransaction.AsEnumerable()
.Where(row => row["ORNo"].ToString() != "")
.GroupBy(row => row["TerminalNo"]);
foreach (var group in grouped)
{
string folder = group.Key.ToString();
Directory.CreateDirectory(folder);
string filename = DateTime.UtcNow.ToString("MMddyyyy") ".txt";
string path = Path.Combine(folder, filename);
using (StreamWriter writer = File.AppendText(path))
{
foreach (DataRow row in group)
{
writer.WriteLine(string.Join(",", row.ItemArray));
}
}
}
Здесь будут созданы каталоги с именами PHW0501 и PHW0502. Вы можете добавить к ним некоторый префикс.
Далее в каждом каталоге будет создан файл.
В файл вводятся данные, разделенные запятыми.
Ответ №2:
используйте этот код. Вы должны поставить после пути к файлу «true», чтобы продолжить вторую строку.
string path = "PATH TO YOU TEXT FILE WITH FILENAME AND EXTENSION";
using (StreamWriter writetext = new StreamWriter(path, true))
{
writetext.WriteLine("Language: " language);
writetext.WriteLine("Log Date: " DateTime.Now.ToString("HH:mm:ss dd/MM/yyyy", DateTimeFormatInfo.InvariantInfo));
}
Комментарии:
1. Спасибо за ответ. Но это должен быть другой путь и другой текст. Я уже отредактировал свой вопрос, чтобы быть более понятным. Спасибо