Pergunta

Existe uma maneira fácil para converter uma seqüência de caracteres de formato csv em uma seqüência de caracteres[] ou lista?

Eu posso garantir que não há vírgulas nos dados.

Foi útil?

Solução

string[] splitString = origString.Split(',');

(Comentário a seguir não adicionou original respondente) Por favor, tenha em mente que esta resposta aborda o caso ESPECÍFICO, onde não são garantidos para ser SEM vírgulas nos dados.

Outras dicas

Seqüência de caracteres.A divisão é só não vai cortá-la, mas uma Regex.Split pode - Tente este:

using System.Text.RegularExpressions;

string[] line;
line = Regex.Split( input, ",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))");

Onde 'entrada' é o csv linha.Isto irá lidar citado delimitadores, e deve dar-lhe de volta uma matriz de cadeias de caracteres que representam cada um campo na linha.

Se você deseja robusto CSV manipulação, confira FileHelpers

Tente:

Regex rex = new Regex(",(?=([^\"]*\"[^\"]*\")*(?![^\"]*\"))");
string[] values = rex.Split( csvLine );

Fonte: http://weblogs.asp.net/prieck/archive/2004/01/16/59457.aspx

Você pode dar uma olhada no uso da Microsoft.VisualBasic conjunto com a

Microsoft.VisualBasic.FileIO.TextFieldParser

Ele lida com CSV (ou qualquer delimitador) com aspas.Eu achei muito prático recentemente.

Não há uma maneira simples de fazer isso bem, se você deseja conta para citou elementos com vírgulas incorporadas, especialmente se eles são misturados com não-campos entre aspas.

Você também provavelmente quer converter as linhas de um dicionário, codificada pelo nome de coluna.

Meu código para fazer isso é várias centenas de linhas de comprimento.

Eu acho que existem alguns exemplos na web, projetos de código aberto, etc.

Tente isso;

static IEnumerable<string> CsvParse(string input)
{
    // null strings return a one-element enumeration containing null.
    if (input == null)
    {
        yield return null;
        yield break;
    }

    // we will 'eat' bits of the string until it's gone.
    String remaining = input;
    while (remaining.Length > 0)
    {

        if (remaining.StartsWith("\"")) // deal with quotes
        {
            remaining = remaining.Substring(1); // pass over the initial quote.

            // find the end quote.
            int endQuotePosition = remaining.IndexOf("\"");
            switch (endQuotePosition)
            {
                case -1:
                    // unclosed quote.
                    throw new ArgumentOutOfRangeException("Unclosed quote");
                case 0:
                    // the empty quote
                    yield return "";
                    remaining = remaining.Substring(2);
                    break;
                default:
                    string quote = remaining.Substring(0, endQuotePosition).Trim();
                    remaining = remaining.Substring(endQuotePosition + 1);
                    yield return quote;
                    break;
            }
        }
        else // deal with commas
        {
            int nextComma = remaining.IndexOf(",");
            switch (nextComma)
            {
                case -1:
                    // no more commas -- read to end
                    yield return remaining.Trim();
                    yield break;

                case 0:
                    // the empty cell
                    yield return "";
                    remaining = remaining.Substring(1);
                    break;

                default:
                    // get everything until next comma
                    string cell = remaining.Substring(0, nextComma).Trim();
                    remaining = remaining.Substring(nextComma + 1);
                    yield return cell;
                    break;
            }
        }
    }

}
CsvString.split(',');

Obter uma seqüência de[] de todas as linhas:

string[] lines = System.IO.File.ReadAllLines("yourfile.csv");

Em seguida, o ciclo através de e dividir as linhas (esta sujeito a erros, porque não verificar vírgulas na citação-campos delimitados):

foreach (string line in lines)
{
    string[] items = line.Split({','}};
}
string s = "1,2,3,4,5";

string myStrings[] = s.Split({','}};

Note que o Split() leva uma matriz de caracteres para dividir em.

Alguns arquivos CSV ter aspas em torno a valores, juntamente com uma vírgula.Portanto, às vezes, você pode dividir este literal de cadeia de caracteres:","

Um arquivo Csv, com campos delimitados por aspas, não é um arquivo Csv.Muito mais coisas (Excel) saída sem aspas em vez de aspas quando você selecionar "Csv" em salvar como.

Se você quiser que você pode usar, grátis, ou comprometer-se, aqui de minas que também faz IDataReader/Registro.Ele também usa DataTable para definir/converter/impor colunas e DbNull.

http://github.com/claco/csvdatareader/

Ele não faz aspas..ainda.Eu só regamos juntos há poucos dias para coçar uma coceira.

Esquecido Ponto-E-Vírgula:Bom link.Obrigado.cfeduke:Obrigado pela dica para a Microsoft.VisualBasic.FileIO.TextFieldParser.Entrar em CsvDataReader hoje à noite.

http://github.com/claco/csvdatareader/ atualizado usando TextFieldParser sugerido por cfeduke.

Apenas alguns adereços de distância de expor os separadores/trimspaces/tipo de ig, você só precisa do código para roubar.

Eu já estava divisão em abas, para este fez o truque para mim:

public static string CsvToTabDelimited(string line) {
    var ret = new StringBuilder(line.Length);
    bool inQuotes = false;
    for (int idx = 0; idx < line.Length; idx++) {
        if (line[idx] == '"') {
            inQuotes = !inQuotes;
        } else {
            if (line[idx] == ',') {
                ret.Append(inQuotes ? ',' : '\t');
            } else {
                ret.Append(line[idx]);
            }
        }
    }
    return ret.ToString();
}
string test = "one,two,three";
string[] okNow = test.Split(',');
separationChar[] = {';'}; // or '\t' ',' etc.
var strArray = strCSV.Split(separationChar);
string[] splitStrings = myCsv.Split(",".ToCharArray());
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top