Как я лучше всего генерирую CSV (файл разделенного текста запятой) для загрузки с ASP.NET?

Turing85 дал вам хороший совет. Я бы посоветовал вам следовать этому, чтобы понять, что пошло не так в вашем коде.

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

Рассмотрим приведенный ниже фрагмент из вашего кода:

        if( score <= 100 )
        {
            if( score >= 90 )
                grade = "A";

        }
        else if( score <= 89 )
        {
            if( score >= 80 )
                grade = "B";
                return grade;

        }

Если score равно >=90, grade устанавливается как A. Но если score - это не >=90, а <=100, то он не пойдет в блок else if, где вы установите его на B, поскольку он будет напрямую выходить из else if лестницы из [ 1113] состояние.

Таким образом, вы должны изменить метод, как показано ниже:

public static String scoreToGrade( int score )
        {
            String grade = "";
            if( score <= 100 && score >= 90 )
            {
                    grade = "A";
            }
            else if( score <= 89 && score >= 80)
            {
                    grade = "B";
            }
            else if( score <= 79 && score >= 70)
            {
                    grade = "C";
            }
            else if( score <= 69 && score >= 60)
            {
                    grade = "D";
            }
            else if( score <= 59 && score >= 50)
            {
                    grade = "E";
            }
            else if( score <= 49 && score >= 0)
            {
                    grade = "F";
            }
            else
            {
                grade = "Error: score " + score;
            }
            return grade;
        }
18
задан Zack Peterson 4 September 2008 в 17:07
поделиться

6 ответов

Форматирование CSV имеет некоторые глюки. Задайте Вы сами эти вопросы:

  • какие-либо из моих данных имеют встроенные запятые?
  • какие-либо из моих данных имеют встроенные двойные кавычки?
  • Делает какие-либо из моих данных, имеют, имеют новые строки?
  • я должен поддерживать строки Unicode?

я вижу несколько проблем в Вашем коде выше. Вещь запятой, в первую очередь... Вы разделяете запятые:

CsvLine.Append(Format(b.Price, "c").Replace(",", ""))

, Почему? В CSV необходимо окружать что-либо, что имеет запятые с кавычками:

CsvLine.Append(String.Format("\"{0:c}\"", b.Price))

(или что-то как этот... мой VB не очень хорош). Если Вы не уверены, существуют ли запятые, но помещенные кавычки вокруг этого. Если существуют кавычки в строке, необходимо выйти из них путем удвоения их. " становится "".

b.Title.Replace("\"", "\"\"")

Затем окружают это кавычками, если Вы хотите. Если существуют новые строки в Вашей строке, необходимо окружить строку кавычками... да, литеральные новые строки позволены в файлах CSV. Это выглядит странным людям, но это - вся польза.

А хорошее устройство записи CSV требует некоторой мысли. Хороший читатель CSV (синтаксический анализатор) просто тверд (и не, regex не достаточно хороший для парсинга CSV... это только получит Вас приблизительно 95% пути там).

И затем существует Unicode... или в более общем плане I18N (Интернационализация) проблемы. Например, Вы разделяете запятые из отформатированной цены. Но это предполагает, что цена отформатирована, поскольку Вы ожидаете это в США. Во Франции форматирование чисел инвертируется (периоды, используемые вместо запятых, и наоборот ). Нижняя строка, используйте агностика культуры, форматирующего по мере возможности.

, В то время как проблема здесь генерация CSV, неизбежно необходимо будет проанализировать CSV. В.NET лучший синтаксический анализатор, который я нашел (бесплатно), Быстрый Читатель CSV на CodeProject. Я на самом деле использовал его в производственном коде, и это действительно действительно быстро, и очень просто в использовании!

22
ответ дан 30 November 2019 в 07:00
поделиться

Я передаю все свои данные CSV через функцию как это:

Function PrepForCSV(ByVal value As String) As String
    return String.Format("""{0}""", Value.Replace("""", """"""))
End Function

кроме того, если Вы не подаете HTML, Вы, вероятно, хотите http обработчик (.as файл h x), а не полная веб-страница. При создании нового обработчика в Visual Studio разногласия - Вы, мог бы просто скопировать мимо Вашего существующего кода в основной метод, и это будет просто работать с маленьким повышением производительности для Ваших усилий.

8
ответ дан 30 November 2019 в 07:00
поделиться

Если Вы хотите разграниченный преобразователь значения двоеточия затем существует сторонний открытый исходный код, названный FileHelpers. Я не уверен, о какой лицензии с открытым исходным кодом это находится под, но она помогла мне довольно много.

3
ответ дан 30 November 2019 в 07:00
поделиться

Можно создать эквивалент bookString () в самом запросе. Вот то, что я думаю, был бы более простой путь.

protected void Page_Load(object sender, EventArgs e)
{
    using (var db = new bookDevelopmentDataContext())
    {
        string fileName = "book.csv";
        var q = from b in db.books
                select string.Format("{0:d},\"{1}\",\"{2}\",{3:F2}", b.Published, b.Title.Replace("\"", "\"\""), b.Author.Replace("\"", "\"\""), t.price);

        string outstring = string.Join(",", q.ToArray());

        Response.Clear();
        Response.ClearHeaders();
        Response.ContentType = "text/csv";
        Response.AppendHeader("Content-Disposition", string.Format("attachment;filename={0}", fileName));
        Response.Write("Published,Title,Author,Price," + outstring);
        Response.End();
    }
}
4
ответ дан 30 November 2019 в 07:00
поделиться

Существует много издержек, связанных с классом Page. Так как Вы просто выкладываете файл CSV и не имеете никакой потребности в обратной передаче, управлении сервером, кэшировании или остальной части его, необходимо превратить это в обработчик с .ashx расширением. Посмотрите здесь .

2
ответ дан 30 November 2019 в 07:00
поделиться

В дополнение к тому, что сказал Simon, можно хотеть читать руководство практического руководства CSV и удостовериться, что вывод не натыкается ни на один из глюков.

Для разъяснения чего-то Simon сказал:

Затем окружают это кавычками, если Вы захотите

Поля, которые содержат согнутые двойные кавычки (""), то должен будет быть полностью окружен двойными кавычками. Не должно быть никакого вреда в просто обертывании всех полей с двойными кавычками, если Вы конкретно не хотите, чтобы синтаксический анализатор разделил ведущий и запаздывающий пробел (вместо того, чтобы обрезать его сами).

1
ответ дан 30 November 2019 в 07:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: