Radzenie sobie z przecinkami w pliku CSV

Szukam sugestii, jak obsługiwać plik csv, który jest tworzony, a następnie przesyłany przez naszych klientów, i który może mieć przecinek w wartości, takiej jak nazwa firmy.

Niektóre z pomysłów, na które patrzymy, to: quoted Identifiers (value "," values ","etc) lub użycie a / zamiast przecinka. Największym problemem jest to, że musimy to ułatwić, inaczej klient tego nie zrobi.

 484
csv
Author: Svante, 2009-04-20

27 answers

Jak mówili inni, musisz unikać wartości zawierających cudzysłowy. Oto mały czytnik CSV w języku C♯, który obsługuje cytowane wartości, w tym osadzone cytaty i zwroty karetek.

Przy okazji, to jest kod testowany jednostkowo. Zamieszczam go teraz, ponieważ to pytanie wydaje się często pojawiać i inni mogą nie chcieć całej biblioteki, gdy wystarczy prosta obsługa CSV.

Możesz go użyć w następujący sposób:

using System;
public class test
{
    public static void Main()
    {
        using ( CsvReader reader = new CsvReader( "data.csv" ) )
        {
            foreach( string[] values in reader.RowEnumerator )
            {
                Console.WriteLine( "Row {0} has {1} values.", reader.RowIndex, values.Length );
            }
        }
        Console.ReadLine();
    }
}
Oto zajęcia. Zauważ, że możesz użyć funkcji Csv.Escape aby napisać poprawny plik CSV.
using System.IO;
using System.Text.RegularExpressions;

public sealed class CsvReader : System.IDisposable
{
    public CsvReader( string fileName ) : this( new FileStream( fileName, FileMode.Open, FileAccess.Read ) )
    {
    }

    public CsvReader( Stream stream )
    {
        __reader = new StreamReader( stream );
    }

    public System.Collections.IEnumerable RowEnumerator
    {
        get {
            if ( null == __reader )
                throw new System.ApplicationException( "I can't start reading without CSV input." );

            __rowno = 0;
            string sLine;
            string sNextLine;

            while ( null != ( sLine = __reader.ReadLine() ) )
            {
                while ( rexRunOnLine.IsMatch( sLine ) && null != ( sNextLine = __reader.ReadLine() ) )
                    sLine += "\n" + sNextLine;

                __rowno++;
                string[] values = rexCsvSplitter.Split( sLine );

                for ( int i = 0; i < values.Length; i++ )
                    values[i] = Csv.Unescape( values[i] );

                yield return values;
            }

            __reader.Close();
        }
    }

    public long RowIndex { get { return __rowno; } }

    public void Dispose()
    {
        if ( null != __reader ) __reader.Dispose();
    }

    //============================================


    private long __rowno = 0;
    private TextReader __reader;
    private static Regex rexCsvSplitter = new Regex( @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))" );
    private static Regex rexRunOnLine = new Regex( @"^[^""]*(?:""[^""]*""[^""]*)*""[^""]*$" );
}

public static class Csv
{
    public static string Escape( string s )
    {
        if ( s.Contains( QUOTE ) )
            s = s.Replace( QUOTE, ESCAPED_QUOTE );

        if ( s.IndexOfAny( CHARACTERS_THAT_MUST_BE_QUOTED ) > -1 )
            s = QUOTE + s + QUOTE;

        return s;
    }

    public static string Unescape( string s )
    {
        if ( s.StartsWith( QUOTE ) && s.EndsWith( QUOTE ) )
        {
            s = s.Substring( 1, s.Length - 2 );

            if ( s.Contains( ESCAPED_QUOTE ) )
                s = s.Replace( ESCAPED_QUOTE, QUOTE );
        }

        return s;
    }


    private const string QUOTE = "\"";
    private const string ESCAPED_QUOTE = "\"\"";
    private static char[] CHARACTERS_THAT_MUST_BE_QUOTED = { ',', '"', '\n' };
}
 229
Author: harpo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-25 23:21:13

Dla roku 2017, csv jest w pełni określony - RFC 4180.

Jest to bardzo powszechna specyfikacja i jest w całości objęta wieloma bibliotekami (przykład ).

Po prostu użyj dowolnej łatwo dostępnej biblioteki csv - czyli RFC 4180.


Istnieje specyfikacja formatu CSV i jak obsługiwać przecinki:

Pola zawierające podziały wierszy (CRLF), podwójne cudzysłowy i przecinki powinny być zamknięte w podwójne cytaty.

http://tools.ietf.org/html/rfc4180

Więc, aby mieć wartości foo i bar,baz, robisz to:

foo,"bar,baz"

Kolejny ważny wymóg do rozważenia (również ze spec):

Jeśli podwójne cudzysłowy są używane do zamykania pól, to podwójny cudzysłów pojawiające się wewnątrz pola muszą być poprzedzone przez kolejny podwójny cytat. Na przykład:

"aaa","b""bb","ccc"
 402
Author: Corey Trager,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-15 17:38:02

Format CSV używa przecinków do oddzielania wartości, wartości zawierające zwroty karetki, linijki, przecinki lub podwójne cudzysłowy są otoczone podwójnymi cudzysłowami. Wartości zawierające podwójne cudzysłowy są cytowane, a każdy literalny cytat jest unikany przez bezpośrednio poprzedzający cytat: na przykład 3 wartości:

test
list, of, items
"go" he said

Będzie zakodowane jako:

test
"list, of, items"
"""go"" he said"

Każde pole może być cytowane, ale tylko pola zawierające przecinki, CR/NL lub cudzysłowy muszą być cytowane.

Nie ma prawdziwego standard dla formatu CSV, ale prawie wszystkie aplikacje postępują zgodnie z konwencjami udokumentowanymi proszę.. RFC, o którym wspomniano w innym miejscu, nie jest standardem dla CSV, jest to RFC do używania CSV w MIME i zawiera pewne niekonwencjonalne i niepotrzebne ograniczenia, które czynią go bezużytecznym poza MIME.

Wiele modułów CSV, które widziałem, nie mieści się w tym, że wiele linii można zakodować w jednym polu, co oznacza, że nie można Załóżmy, że każda linia jest osobnym rekordem, albo musisz nie zezwalać na nowe linie w danych, albo być przygotowanym do obsługi tego.

 76
Author: Robert Gamble,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-05 22:19:56

Umieść podwójne cudzysłowy wokół ciągów. To jest ogólnie to, co robi Excel .

Ala Eli,

Unikasz podwójnego cytatu jako dwóch podwójne cytaty. Np. "test1","foo""bar", "test2"

 40
Author: Joe Phillips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-20 19:27:17

Możesz umieścić podwójne cudzysłowy wokół pól. Nie podoba mi się to podejście, ponieważ dodaje kolejny znak specjalny (podwójny cytat). Po prostu zdefiniuj znak escape (Zwykle odwrotny ukośnik) i używaj go wszędzie tam, gdzie potrzebujesz czegoś uciec:

data,more data,more data\, even,yet more

Nie musisz próbować dopasowywać cudzysłowów i masz mniej WYJĄTKÓW do analizy. Upraszcza to również Twój kod.

 11
Author: Adam Jaskiewicz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-20 19:34:14

Dzięki nuget istnieje biblioteka do obsługi praktycznie każdego dobrze uformowanego pliku CSV (. net) - CsvHelper

Przykład mapowania do klasy:

var csv = new CsvReader( textReader );
var records = csv.GetRecords<MyClass>();

Przykład odczytu poszczególnych pól:

var csv = new CsvReader( textReader );
while( csv.Read() )
{
    var intField = csv.GetField<int>( 0 );
    var stringField = csv.GetField<string>( 1 );
    var boolField = csv.GetField<bool>( "HeaderName" );
}

Pozwalając klientowi sterować formatem pliku:
, jest standardowym ogranicznikiem pól, " jest standardową wartością używaną do usuwania pól zawierających ogranicznik, cudzysłów lub zakończenie linii.

Do użycia (na przykład) # for fields and ' for escape:

var csv = new CsvReader( textReader );
csv.Configuration.Delimiter = "#";
csv.Configuration.Quote = ''';
// read the file however meets your needs

Więcej Dokumentacji

 8
Author: NikolaiDante,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-02 16:59:15

Jeśli jesteś na * Nix-system, masz dostęp do sed i może być jeden lub więcej niechcianych przecinków tylko w określonym polu w pliku CSV możesz użyć poniższego jednowiersza, aby zamknąć je w ", Jak proponuje RFC4180 Sekcja 2:

sed -r 's/([^,]*,[^,]*,[^,]*,)(.*)(,.*,.*)/\1"\2"\3/' inputfile

W zależności od tego, w jakim polu mogą znajdować się niechciane przecinki, musisz zmienić / rozszerzyć grupy przechwytywania regex (i substytucji).
Przykład powyżej znajduje się czwarte pole (z sześciu) w cudzysłowie.

Tutaj wpisz opis obrazka

W połączeniu z --in-place-opcja Możesz zastosować te zmiany bezpośrednio do pliku.

Aby "zbudować" odpowiedni regex, należy przestrzegać prostej zasady:

  1. dla każdego pola w pliku CSV, które pojawia się przed pole z niechcianymi przecinkami wpisujesz jeden [^,]*, i łączysz je wszystkie w grupę przechwytywania.
  2. Dla pole zawierające niechciane przecinki, które wpisujesz (.*).
  3. dla każdego pola po pole z niechcianymi przecinkami wpisujesz jeden ,.* i łączysz je w grupę przechwytywania.

Oto krótki przegląd różnych możliwych wyrażeń regularnych/podstawień w zależności od konkretnego pola. Jeśli nie podano, substytucją jest \1"\2"\3.

([^,]*)(,.*)                     #first field, regex
"\1"\2                           #first field, substitution

(.*,)([^,]*)                     #last field, regex
\1"\2"                           #last field, substitution


([^,]*,)(.*)(,.*,.*,.*)          #second field (out of five fields)
([^,]*,[^,]*,)(.*)(,.*)          #third field (out of four fields)
([^,]*,[^,]*,[^,]*,)(.*)(,.*,.*) #fourth field (out of six fields)

Jeśli chcesz usunąć niechciane przecinki za pomocą sed zamiast zamykać je cudzysłowami zobacz tę odpowiedź .

 5
Author: KeyNone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:16

Jak wspomniałem w komentarzu do odpowiedzi harpo, jego rozwiązanie jest dobre i działa w większości przypadków, Jednak w niektórych scenariuszach, gdy przecinki jako bezpośrednio sąsiadujące ze sobą, nie rozdzielają się na przecinki.

Jest to spowodowane tym, że łańcuch Regex zachowuje się nieoczekiwanie jak łańcuch vertabim. W celu poprawnego zachowania, wszystkie znaki " w łańcuchu regex muszą być unikane ręcznie bez użycia vertabim escape.

Ie. Regex powinien być taki przy użyciu instrukcji escapes:

",(?=(?:[^\"\"]*\"\"[^\"\"]*\"\")*(?![^\"\"]*\"\"))"

Co przekłada się na ",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))"

Podczas używania ciągu vertabim @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))" zachowuje się on następująco, jak widać po debugowaniu wyrażenia regularnego:

",(?=(?:[^"]*"[^"]*")*(?![^"]*"))"
Podsumowując, polecam rozwiązanie harpo, ale uważaj na tego małego gotcha!

Dodałem do Csvreadera mały opcjonalny failsafe, aby powiadomić cię, jeśli wystąpi ten błąd (jeśli masz wcześniej znaną liczbę kolumn):

if (_expectedDataLength > 0 && values.Length != _expectedDataLength) 
throw new DataLengthException(string.Format("Expected {0} columns when splitting csv, got {1}", _expectedDataLength, values.Length));

Można to wstrzyknąć za pomocą konstruktora:

public CsvReader(string fileName, int expectedDataLength = 0) : this(new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
    _expectedDataLength = expectedDataLength;
}
 5
Author: MikeDub,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-29 21:56:02

Dodaj odniesienie do Microsoft.VisualBasic (tak, mówi VisualBasic, ale działa w C# równie dobrze-pamiętaj, że na końcu to wszystko jest po prostu IL).

Użyj klasy Microsoft.VisualBasic.FileIO.TextFieldParser do analizy pliku CSV oto przykładowy kod:

 Dim parser As TextFieldParser = New TextFieldParser("C:\mar0112.csv")
 parser.TextFieldType = FieldType.Delimited
 parser.SetDelimiters(",")      

   While Not parser.EndOfData         
      'Processing row             
      Dim fields() As String = parser.ReadFields         
      For Each field As String In fields             
         'TODO: Process field                   

      Next      
      parser.Close()
   End While 
 4
Author: mvilaskumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-19 14:33:30

Możesz użyć alternatywnych "ograniczników", takich jak"; "Lub"|", ale najprostszym może być cytowanie, które jest obsługiwane przez większość (przyzwoitych) bibliotek CSV i większość przyzwoitych arkuszy kalkulacyjnych.

Dla więcej o ogranicznikach CSV i specyfikacji standardowego formatu opisywania ograniczników i cytowania znajdziesz na tej stronie

 4
Author: Rufus Pollock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-29 12:38:37

Jeśli masz ochotę na odkrycie koła na nowo, poniższe rozwiązania mogą Ci pomóc:

public static IEnumerable<string> SplitCSV(string line)
{
    var s = new StringBuilder();
    bool escaped = false, inQuotes = false;
    foreach (char c in line)
    {
        if (c == ',' && !inQuotes)
        {
            yield return s.ToString();
            s.Clear();
        }
        else if (c == '\\' && !escaped)
        {
            escaped = true;
        }
        else if (c == '"' && !escaped)
        {
            inQuotes = !inQuotes;
        }
        else
        {
            escaped = false;
            s.Append(c);
        }
    }
    yield return s.ToString();
}
 3
Author: Neil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-01 17:27:09

W Europie mamy ten problem musi wcześniej niż to pytanie. W Europie używamy przecinka do przecinka dziesiętnego. Zobacz te liczby poniżej:

| American      | Europe        |
| ------------- | ------------- |
| 0.5           | 0,5           |
| 3.14159265359 | 3,14159265359 |
| 17.54         | 17,54         |
| 175,186.15    | 175.186,15    |

Nie jest więc możliwe użycie separatora przecinków dla plików CSV. Z tego powodu pliki CSV w Europie są oddzielone średnikiem (;).

Programy takie jak Microsoft Excel mogą odczytywać pliki średnikiem i można przełączyć się z separatora. Możesz nawet użyć tab (\t) jako separatora. Zobacz też ta odpowiedź od Użytkownika .

 3
Author: H. Pauwelyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-13 06:42:48

Jeśli jesteś zainteresowany bardziej edukacyjnym ćwiczeniem na temat parsowania plików w ogóle( używając CSV jako przykładu), możesz sprawdzić Ten artykuł autorstwa Juliana Bucknalla. Podoba mi się ten artykuł, ponieważ rozkłada rzeczy na znacznie mniejsze problemy, które są znacznie mniej nie do pokonania. Najpierw tworzysz gramatykę, a gdy już masz dobrą gramatykę, jest to stosunkowo łatwy i metodyczny proces konwersji gramatyki na kod.

Artykuł używa C# i ma link na dole do Pobierz kod.

 2
Author: Phil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-13 16:29:51

Oto zgrabne obejście:

Możesz użyć greckiego znaku dolnej cyfry zamiast (U + 0375)

Wygląda tak

Korzystanie z tej metody oszczędza również wiele zasobów...

 2
Author: Konstantine Nikka-Sher Piterma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-18 17:51:31

Po prostu użyj SoftCircuits.CsvParser on NuGet. Zajmie się wszystkimi tymi szczegółami i sprawnie obsłuży bardzo duże pliki. W razie potrzeby może nawet importować / eksportować obiekty, mapując kolumny do Właściwości obiektu. Ponadto, moje testy wykazały, że średnio prawie 4 razy szybciej niż popularny CsvHelper.

 1
Author: Jonathan Wood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-16 17:27:08

Ponieważ chodzi o ogólne praktyki zacznijmy od zasad kciuka:

  1. Nie używaj CSV, zamiast tego użyj XML z biblioteką do odczytu i zapisu pliku xml.

  2. Jeśli musisz użyć CSV. Zrób to poprawnie i użyj darmowej biblioteki do analizy i przechowywania plików CSV.

Aby uzasadnić 1), Większość parserów CSV nie jest świadoma kodowania, więc jeśli nie masz do czynienia z US-ASCII, prosisz o kłopoty. Na przykład excel 2002 przechowuje plik CSV w kodowaniu lokalnym bez żadnej uwagi o kodowaniu. Standard CSV nie jest powszechnie przyjęty :(. Z drugiej strony standard xml jest dobrze przyjęty i całkiem dobrze radzi sobie z kodowaniem.

Aby uzasadnić 2), Istnieje mnóstwo parserów csv dla prawie wszystkich języków, więc nie ma potrzeby odkrywania koła na nowo, nawet jeśli rozwiązania wyglądają dość prosto.

Aby wymienić kilka:

  • Dla Pythona użyj build in CSV module

  • Dla Perl check CPAN i Text:: CSV

  • Dla php użyj build in fgetcsv / fputcsv functions

  • For java check library

Naprawdę nie ma potrzeby implementowania tego ręcznie, jeśli nie masz zamiaru analizować go na urządzeniu wbudowanym.

 0
Author: Piotr Czapla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-20 19:40:27

Możesz odczytać plik csv w ten sposób.

To sprawia, że korzystanie z podziałów i dba o przestrzenie.

ArrayList List = new ArrayList();
static ServerSocket Server;
static Socket socket;
static ArrayList<Object> list = new ArrayList<Object>();


public static void ReadFromXcel() throws FileNotFoundException
{   
    File f = new File("Book.csv");
    Scanner in = new Scanner(f);
    int count  =0;
    String[] date;
    String[] name;
    String[] Temp = new String[10];
    String[] Temp2 = new String[10];
    String[] numbers;
    ArrayList<String[]> List = new ArrayList<String[]>();
    HashMap m = new HashMap();

         in.nextLine();
         date = in.nextLine().split(",");
         name = in.nextLine().split(",");
         numbers = in.nextLine().split(",");
         while(in.hasNext())
         {
             String[] one = in.nextLine().split(",");
             List.add(one);
         }
         int xount = 0;
         //Making sure the lines don't start with a blank
         for(int y = 0; y<= date.length-1; y++)
         {
             if(!date[y].equals(""))
             {   
                 Temp[xount] = date[y];
                 Temp2[xount] = name[y];
                 xount++;
             }
         }

         date = Temp;
         name =Temp2;
         int counter = 0;
         while(counter < List.size())
         {
             String[] list = List.get(counter);
             String sNo = list[0];
             String Surname = list[1];
             String Name = list[2];
             for(int x = 3; x < list.length; x++)
             {           
                 m.put(numbers[x], list[x]);
             }
            Object newOne = new newOne(sNo, Name, Surname, m, false);
             StudentList.add(s);
             System.out.println(s.sNo);
             counter++;
         }
 0
Author: Eric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-21 05:50:36

Po pierwsze, zadajmy sobie pytanie: "dlaczego czujemy potrzebę odmiennego obchodzenia się z przecinkami w plikach CSV?"

Dla mnie odpowiedź brzmi: "ponieważ gdy eksportuję dane do pliku CSV, przecinki w polu znikają, a moje pole zostaje rozdzielone na wiele pól, w których przecinki pojawiają się w oryginalnych danych."(Że to dlatego, że przecinek jest znakiem separatora pola CSV.)

W zależności od sytuacji Semi dwukropki mogą być również używane jako separatory pól CSV.

Given my wymagania, mogę użyć znaku, np. pojedynczy cudzysłów low-9, który wygląda jak przecinek.

Oto jak możesz to zrobić w Go:

// Replace special CSV characters with single low-9 quotation mark
func Scrub(a interface{}) string {
    s := fmt.Sprint(a)
    s = strings.Replace(s, ",", "‚", -1)
    s = strings.Replace(s, ";", "‚", -1)
    return s
}

Drugi znak przecinka w funkcji Replace to decimal 8218.

Pamiętaj, że jeśli masz klientów, którzy mogą mieć czytniki tekstu tylko ascii, to ten znak decima 8218 nie będzie wyglądał jak przecinek. Jeśli tak jest w Twoim przypadku, to polecam otaczanie pola przecinkiem (lub średnikiem) z podwójnymi cudzysłowami na RFC 4128: https://tools.ietf.org/html/rfc4180

 0
Author: l3x,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-03 19:34:56

Zazwyczaj koduję URL pola, które mogą zawierać przecinki lub znaki specjalne. A następnie dekoduj go, gdy jest używany/wyświetlany w dowolnym medium wizualnym.

(przecinek staje się %2c)

Każdy język powinien mieć metody kodowania i dekodowania łańcuchów url.

Np. w Javie

URLEncoder.encode(myString,"UTF-8"); //to encode
URLDecoder.decode(myEncodedstring, "UTF-8"); //to decode

Wiem, że jest to bardzo ogólne rozwiązanie i może nie być idealne dla sytuacji, w której użytkownik chce ręcznie przeglądać zawartość pliku csv.

 0
Author: hariszhr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-22 11:27:31

Zwykle robię to w plikach CSV procedury parsowania. Załóżmy, że zmienna 'line' jest jednym wierszem w pliku CSV, a wszystkie wartości kolumn są zamknięte w podwójnych cudzysłowach. Po wykonaniu poniższych dwóch linii otrzymasz kolumny CSV w kolekcji 'values'.

// The below two lines will split the columns as well as trim the DBOULE QUOTES around values but NOT within them
    string trimmedLine = line.Trim(new char[] { '\"' });
    List<string> values = trimmedLine.Split(new string[] { "\",\"" }, StringSplitOptions.None).ToList();
 0
Author: user1451111,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-10 14:43:30

Najprostszym rozwiązaniem, jakie znalazłem, jest to, którego używa LibreOffice:

  1. Zastąp wszystkie literały " przez
  2. umieść podwójne cudzysłowy wokół twojego ciągu

Możesz również użyć tego, którego używa Excel:

  1. Zastąp wszystkie literały " przez ""
  2. umieść podwójne cudzysłowy wokół twojego ciągu

Zwróć uwagę, że inne osoby zalecają wykonanie tylko kroku 2 powyżej, ale to nie działa z liniami, po których następuje " ,, jak w Plik CSV, w którym chcesz mieć pojedynczą kolumnę z łańcuchem hello",world, jak w pliku CSV:

"hello",world"

Który jest interpretowany jako wiersz z dwiema kolumnami: hello i world"

 0
Author: Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-18 03:42:19
    public static IEnumerable<string> LineSplitter(this string line, char 
         separator, char skip = '"')
    {
        var fieldStart = 0;
        for (var i = 0; i < line.Length; i++)
        {
            if (line[i] == separator)
            {
                yield return line.Substring(fieldStart, i - fieldStart);
                fieldStart = i + 1;
            }
            else if (i == line.Length - 1)
            {
                yield return line.Substring(fieldStart, i - fieldStart + 1);
                fieldStart = i + 1;
            }

            if (line[i] == '"')
                for (i++; i < line.Length && line[i] != skip; i++) { }
        }

        if (line[line.Length - 1] == separator)
        {
            yield return string.Empty;
        }
    }
 0
Author: Rajat26,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-11 18:45:30

Użyłem Biblioteki Csvreader, ale korzystając z niej otrzymałem dane eksplodując z przecinka (,) w wartości kolumny.

Więc jeśli chcesz wstawić dane pliku CSV, który zawiera przecinek (,) w większości wartości kolumn, możesz użyć poniższej funkcji. Autor link = > https://gist.github.com/jaywilliams/385876

function csv_to_array($filename='', $delimiter=',')
{
    if(!file_exists($filename) || !is_readable($filename))
        return FALSE;

    $header = NULL;
    $data = array();
    if (($handle = fopen($filename, 'r')) !== FALSE)
    {
        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE)
        {
            if(!$header)
                $header = $row;
            else
                $data[] = array_combine($header, $row);
        }
        fclose($handle);
    }
    return $data;
}
 0
Author: Vi_real,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-13 18:41:52

Użyłem biblioteki papaParse, aby parować plik CSV i mieć pary klucz-wartość (klucz/nagłówek/pierwszy wiersz wartości pliku CSV).

Oto przykład, którego używam:

Https://codesandbox.io/embed/llqmrp96pm

MA manekina.plik csv zawiera demo parsowania CSV.

Użyłem go w ReactJS, choć jest łatwy i prosty do replikowania w aplikacji napisanej dowolnym językiem.

 0
Author: parag patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-24 03:28:32

Przykład może pomóc w pokazaniu, jak przecinki mogą być wyświetlane w a .plik csv. Utwórz prosty plik tekstowy w następujący sposób:

Zapisz ten plik tekstowy jako plik tekstowy z sufiksem".csv " i otwórz go w programie Excel 2000 z systemu Windows 10.

Aa, bb, cc, d;d "W prezentacji arkusza kalkulacyjnego, poniższy wiersz powinien wyglądać jak powyższy wiersz, z tym, że poniżej pokazuje wyświetlany przecinek zamiast średnika między d." aa, bb, cc, "d, d", to działa nawet w Excelu

Aa, bb, cc," d, d", to działa nawet w Excelu 2000 aa, bb, cc, "d, d", to działa nawet w Excelu 2000 aa,bb, cc,"d, d", to działa nawet w Excelu 2000

Aa, bb, cc, "d, d", to nie działa w Excelu 2000 ze względu na spację 1. cytat aa, bb, cc, "d, d", to nie w Excelu 2000 ze względu na spację belore 1. cytat w Excelu 2000 nie jest to możliwe ze względu na spację belore 1st quote

Aa, bb, cc, "d, d", działa to nawet w Excelu 2000, nawet ze spacjami przed i po 2. cytacie. aa, bb, cc, " d, d " Działa to nawet w Excelu 2000 nawet ze spacjami przed i po 2. cytacie. aa, bb, cc, "d, d", działa to nawet w Excelu 2000, nawet ze spacjami przed i po 2. cytacie.

Reguła: jeśli chcesz wyświetlić przecinek w komórce (polu) a .plik csv: "Zacznij i zakończ pole podwójnym cudzysłowem, ale unikaj spacji przed pierwszym cytatem"

 0
Author: user1247591,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-18 01:07:04

Myślę, że najprostszym rozwiązaniem tego problemu jest, aby Klient otworzył plik csv w Excelu, a następnie ctrl + R, aby zastąpić cały przecinek dowolnym identyfikatorem. Jest to bardzo łatwe dla klienta i wymaga tylko jednej zmiany w kodzie, aby odczytać wybrany ogranicznik.

 -1
Author: jamesdeath123,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-24 19:41:57

Użyj znaku tabulacji (\t), aby oddzielić pola.

 -4
Author: Pierre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-17 00:06:56