2012-04-17 7 views
1

Я знаю, что вопрос был задан раньше, но я был не вполне доволен ответом (учитывая, что он не объяснил, что происходит).Простая csv-таблица с разделителями html-таблицы

Мой конкретный вопрос: Как открыть текстовый файл csv/text, разделенный запятой, и строки разделяются с помощью возвратов и помещают их в таблицу HTML с помощью C#?

Я понимаю, как это сделать на PHP, но я только начал изучать ASP.Net/C#, если у кого-то есть свободные ресурсы для C# и/или может предоставить мне фрагмент кода с некоторым объяснением того, что Продолжая, я был бы признателен.

У меня есть этот код, но я не уверен, как использовать его, потому что A) Я не знаю, как работают массивы C# и B) Я не уверен, как открывать файлы в ASP.Net C#:

var lines =File.ReadAllLines(args[0]); 
    using (var outfs = File.AppendText(args[1])) 
    { 
     outfs.Write("<html><body><table>"); 
     foreach (var line in lines) 
      outfs.Write("<tr><td>" + string.Join("</td><td>", line.Split(',')) + "</td></tr>"); 
     outfs.Write("</table></body></html>"); 
    } 

Прошу прощения за мою вопиющую неопытность здесь.

+0

Массивы: http://msdn.microsoft.com/en-us/library/aa288453%28v=vs.71%29.aspx –

+0

Чтение текстовых файлов: http://www.csharp-station.com/HowTo /ReadWriteTextFile.aspx –

+1

Каков ваш конкретный вопрос? –

ответ

2

Пример кода вы вывесили именно то, что вы спрашиваете:

  1. Открывает файл.
  2. Записывает строку HTML для таблицы с содержимым файла с шага 1 в другой файл.

Давайте разбить его:

var lines =File.ReadAllLines(args[0]); 

Это открывает файл, указанный в аргументах [0] и читает все строки в массив строк, один лежал на элемент. См. File.ReadAllLines Method (String).

using (var outfs = File.AppendText(args[1])) 
{ 

File.AppendText Method создает StreamWriter для добавления текста в существующий файл (или создает его, если он не существует). Имя файла (и путь, возможно) находится в args [1]. Оператор using помещает StreamWriter в так называемый блок использования, чтобы обеспечить правильное размещение потока после того, как останется блок использования. См. using Statement (C# Reference) для получения дополнительной информации.

outfs.Write("<html><body><table>"); 

outfs.Write вызывает метод записи в StreamWriter (StreamWriter.Write Method (String)). Фактически в случае вашего фрагмента кода ничего не записывается в файл до тех пор, пока вы не выйдете из блока использования - он записывается в буфер. Выход из используемого блока приведет к сбросу буфера и записи в файл.

foreach (var line in lines) 

Эта команда запускает цикл по всем элементам в массив строк lines, глядя с первым элементом (0) индекса. См. foreach, in (C# Reference) для получения дополнительной информации, если вам это нужно.

 outfs.Write("<tr><td>" + string.Join("</td><td>", line.Split(',')) + "</td></tr>"); 

String.Join - ключевая часть здесь, где большая часть работы выполнена.String.Join Method (String, String[]) имеет технические подробности, но в основном то, что здесь происходит, состоит в том, что второй аргумент (line.Split(',')) передается в массиве строк, а строки в этом массиве затем объединяются вместе с первым аргументом (</td><td>) в качестве разделителя, и строка таблицы открывается и закрывается.

Например, если строка «1,2,3,4,5,6», то Split дает вам 6-элементный массив. Затем этот массив объединяется с </td><td> в качестве разделителя на String.Join, поэтому у вас есть "1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6". "<tr><td>" добавлен в начало и "</td></tr>" добавлен в конец, а окончательная строка - "<tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td></tr>".

outfs.Write("</table></body></html>");  
} 

Это записывает конец HTML в буфер, который затем очищается и записывается в указанный текстовый файл.

Несколько вещей, чтобы отметить. args[0] и args[1] используются для хранения аргументов командной строки (т. Е. MakeMyTable.exe InFile.txt OutFile.txt), которые (по моему опыту) не применимы к приложениям ASP.NET. Вам нужно либо запрограммировать файлы (и пути), либо разрешить пользователю указывать входной файл и/или выходной файл. Приложение ASP.NET должно запускаться под учетной записью, имеющей разрешение на доступ к этим файлам.

Если вы указали значения в CSV-файле, вам придется обрабатывать их (это очень часто встречается, например, при использовании денежных сумм), так как разделение на , может привести к некорректному разделению. Я рекомендую взглянуть на TextFieldParser, так как он может обрабатывать поля с котировкой довольно легко.

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

Кроме того, было бы полезно проверить, что файл, который вы открываете, существует. Там, вероятно, больше, но это основы (и, возможно, уже выходит за пределы стека переполнения).

+0

Я не хотел звучать так глупо в своем оригинальном посте, но я сделал вид посмотрите, что происходит с открытой файловой линией 'var lines = File.ReadAllLines (args [0]);' но смутило массив, находящийся там, и не обозначение фактического местоположения файла в коде. Кроме того, мне не нужно использовать кавычки, в моем файле csv никогда не будет кавычек, я прошу прощения за то, что я не понимаю. И, наконец, спасибо за то, что вы пытаетесь прояснить ситуацию для меня, кажется, что моя проблема не в том, чтобы понять, что это связано с массивом 'args [0]'. –

1

Надеюсь, это поможет сориентировать вас в правильном направлении:

line = "<table>" + line; 
foreach (string line in lines) 
{ 
    line = "<tr><td>" + line; 
    line.Replace(",", "</td><td>"); 
    line += "</td></tr>"; 
} 
Response.Write(line + "</table>"); 

Удачи с вашего обучения!

+0

Вам не хватает открытия ''. – BeemerGuy

+0

В дополнение к отсутствующему открытию '', вы делаете много конкатентации строк, что может стать дорогостоящим. Было бы лучше использовать StringBuilder. – Tim

+0

@ BeemerGuy.net Правда, извините. Когда я написал это, раздался звонок в дверь, и я спешил. Исправлено. Тим: Опять же, правда, StringBuilder был бы лучшим вариантом. Я просто пытался указать OP в правильном направлении - надеюсь, они понимают этот метод больше, чем тот, который он опубликовал. – kieranajp

Смежные вопросы