все
Я начал с того, что, как я думал, будет довольно простой задачей. (преобразовать csv в формат "wiki"), но я столкнулся с несколькими трудностями, с которыми у меня возникают проблемы при работе с
У меня 3 основные проблемы
1) некоторые ячейки содержат \ r \ n (поэтому при чтении построчно каждая новая строка обрабатывается как новая ячейка
2) некоторые строки содержат "," (я попытался переключиться на \ t удаленные файлы, но у меня все еще возникает проблема с выходом, когда между двумя "") *
3) некоторые строки полностью пустые, за исключением разделителя ("," или "\ t"), другие неполные (это нормально, мне просто нужно убедиться, что ячейка находится в правильном месте)
Я пробовал несколько классов для чтения CSV, но они могли бы увеличить число проблем, перечисленных выше
Я стараюсь, чтобы это приложение было как можно меньшего размера, поэтому я также стараюсь избегать dll и больших классов, которые только небольшая часть делает то, что я хочу.
пока у меня есть две "попытки, которые не работают
Попытка 1 (не переносит \ r \ n в ячейке)
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
openFileDialog1.Filter = "tab sep file (*.txt)|*.txt|All files (*.*)|*.*";
openFileDialog1.FilterIndex = 1;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
if (cb_sortable.Checked)
{
header = "{| class=\"wikitable sortable\" border=\"1\" \r\n|+ Sortable table";
}
StringBuilder sb = new StringBuilder();
string line;
bool firstline = true;
StreamReader sr = new StreamReader(openFileDialog1.FileName);
sb.AppendLine(header);
while ((line = sr.ReadLine()) != null)
{
if (line.Replace("\t", "").Length > 1)
{
string[] hold;
string lead = "| ";
if (firstline && cb_header.Checked == true)
{
lead = "| align=\"center\" style=\"background:#f0f0f0;\"| ";
}
hold = line.Split('\t');
sb.AppendLine(table);
foreach (string row in hold)
{
sb.AppendLine(lead + row.Replace("\"", ""));
}
firstline = false;
}
}
sb.AppendLine(footer);
Clipboard.SetText(sb.ToString());
MessageBox.Show("Done!");
}
}
string header = "{| class=\"wikitable\" border=\"1\" ";
string footer = "|}";
string table = "|-";
попытка 2 (может обрабатывать \ r \ n, но смещает ячейки над пустыми ячейками) (еще не завершена)
OpenFileDialog openFileDialog1 = новый OpenFileDialog ();
openFileDialog1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
openFileDialog1.Filter = "txt file (*.txt)|*.txt|All files (*.*)|*.*";
openFileDialog1.FilterIndex = 1;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
if (cb_sortable.Checked)
{
header = "{| class=\"wikitable sortable\" border=\"1\" \r\n|+ Sortable table";
}
using (StreamReader sr = new StreamReader(openFileDialog1.FileName))
{
string text = sr.ReadToEnd();
string[] cells = text.Split('\t');
int columnCount = 0;
foreach (string cell in cells)
{
if (cell.Contains("\r\n"))
{
break;
}
columnCount++;
}
}
по сути, все, что мне нужно, это "разделить, если не между \" ", но сейчас я просто в растерянности
Любые советы или подсказки будут с благодарностью