C # Не разбивать строку на запятую - PullRequest
0 голосов
/ 23 февраля 2019

Я использую Xamarin.Forms для создания приложения для сбора данных.Особенностью этого приложения является экспорт данных через CSV.При захвате данные записываются в текстовый файл с использованием следующего метода:

 public void WriteToFile(string CompanyName, string Website, string FirsttName, string LastName, string JobTitle, string Phone, string Email, string Solution, string Notes, string ContactOwner, string EventName)
    {
        string path = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
        string filename = System.IO.Path.Combine(path, "Prospects.txt");
        string lineToBeAdded = string.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}", CompanyName, Website, FirsttName, LastName, JobTitle, Phone, Email, Solution, Notes, ContactOwner, EventName);
        File.AppendAllText(filename, lineToBeAdded + Environment.NewLine);


    }

Моя проблема заключается в том, что в переменной NOTES пользователь использует в своем описании запятые, которые портят структуру CSV.

Как заставить игнорировать запятые в этой строке?

Ответы [ 3 ]

0 голосов
/ 23 февраля 2019

Также вам не нужно использовать запятые, вы можете использовать |или что-то еще, что пользователь не использует.

Чтобы сделать его еще более удобным, вы можете указать разделитель в первой строке, поддерживает Excel, который я знаю.

sep=|
header1|header2|header3
1,2|2,3|3,4
0 голосов
/ 23 февраля 2019

Решение

Создайте эту функцию:

string GetCsvLine(params string[] fields) =>
   string.Join(",", fields.Select(x => $"\"{x.Replace("\"", "\"\"")}\""));

И назовите ее так, заменив строку в вашем примере кода, которая инициализирует "lineToBeAdded":

string lineToBeAdded = GetCsvLine(CompanyName, Website, FirsttName, LastName, JobTitle, Phone, Email, Solution, Notes, ContactOwner, EventName);

Объяснение

См. здесь - RFC4180 - к спецификации для CSV:

Суммирование:

  • Поле должно быть заключено в двойныекавычки, если он содержит запятую, разрыв строки или двойные кавычки.
  • Любые двойные кавычки в поле должно быть удвоено.
  • Бонус: использование 'params' и LINQ позволяет вам вызывать этот метод с переменным числом аргументов, устраняя необходимость в строке формата с точным количеством заполнителей.
0 голосов
/ 23 февраля 2019

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

 string lineToBeAdded = string.Format("\"{0}\",\"{1}\",\"{2}\",\"{3}\",\"{4}\",\"{5}\",\"{6}\",\"{7}\",\"{8}\",\"{9}\",\"{10}\"", 
CompanyName.Replace("\"","\"\""),
 Website.Replace("\"","\"\""),
 FirsttName.Replace("\"","\"\""),
 LastName.Replace("\"","\"\""),
 JobTitle.Replace("\"","\"\""),
 Phone.Replace("\"","\"\""),
 Email.Replace("\"","\"\""),
 Solution.Replace("\"","\"\""),
 Notes.Replace("\"","\"\""),
 ContactOwner.Replace("\"","\"\""),
 EventName.Replace("\"","\"\""));
...