Skip to content

Instantly share code, notes, and snippets.

@onlytiancai
Last active December 13, 2015 21:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save onlytiancai/4975822 to your computer and use it in GitHub Desktop.
Save onlytiancai/4975822 to your computer and use it in GitHub Desktop.
按空格和制表符分割文本,求重构
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleTest
{
class Program
{
/// <summary>
/// 按空格或制表符分割文本,连续的空白字符会忽略,双引号或单引号括住的算一项,双引号里的双引号和单引号里的单引号前要加个转义的\
/// </summary>
static string[] splitText(string line)
{
if (string.IsNullOrEmpty(line))
return new string[] { };
List<string> result = new List<string>();
StringBuilder sb = new StringBuilder();
// 解析标志位:
// 0: 正在解析字符
// 1: 遇到左边的单引号
// 2: 遇到左边的双引号
// 3: 左单引号里遇到\
// 4: 左双引号里遇到\
int state = 0;
foreach (char ch in line)
{
switch (ch)
{
case ' ':
case '\t':
switch (state)
{
case 0:
if (sb.Length > 0)
{
result.Add(sb.ToString());
sb.Length = 0;
}
break;
case 1:
case 2:
sb.Append(ch);
break;
case 3:
case 4:
sb.Append('\\');
sb.Append(ch);
break;
}
break;
case '\'':
switch (state)
{
case 0:
state = 1;
break;
case 1:
state = 0;
result.Add(sb.ToString());
sb.Length = 0;
break;
case 2:
sb.Append(ch);
break;
case 3:
sb.Append('\'');
state = 1;
break;
case 4:
sb.Append('\\');
sb.Append(ch);
state = 2;
break;
}
break;
case '\"':
switch (state)
{
case 0:
state = 2;
break;
case 1:
sb.Append(ch);
break;
case 2:
state = 0;
result.Add(sb.ToString());
sb.Length = 0;
break;
case 3:
sb.Append('\\');
sb.Append(ch);
state = 1;
break;
case 4:
sb.Append('\"');
state = 2;
break;
}
break;
case '\\':
switch (state)
{
case 0:
sb.Append(ch);
break;
case 1:
state = 3;
break;
case 2:
state = 4;
break;
case 3:
sb.Append('\\');
sb.Append(ch);
break;
case 4:
sb.Append('\\');
sb.Append(ch);
break;
}
break;
default:
sb.Append(ch);
break;
}
}
if (sb.Length > 0)
{
result.Add(sb.ToString());
}
return result.ToArray();
}
static void Main(string[] args)
{
string input = "11 22\t33\t\t44 \'55\t55\\\'55\\\"\' \"66\\\"66 66\'\"";
Console.WriteLine(input);
foreach (string item in splitText(input))
{
Console.WriteLine("\t|||{0}|||", item);
}
Console.ReadKey();
}
}
}
@ipconfiger
Copy link

import csv
with open('sample.csv', 'rb') as csvfile:
spamreader = csv.reader(csvfile, delimiter='\t', quotechar='“')
for row in spamreader:
print ' - '.join(row)

@ipconfiger
Copy link

// TextFieldParser is in the Microsoft.VisualBasic.FileIO namespace.
using (TextFieldParser parser = new TextFieldParser(path))
{
    parser.CommentTokens = new string[] { "#" };
    parser.SetDelimiters(new string[] { ";" });
    parser.HasFieldsEnclosedInQuotes = true;
    // Skip over header line.
    parser.ReadLine();

    while (!parser.EndOfData)
    {
        string[] fields = parser.ReadFields();
        yield return new Brand()
        {
            Name = fields[0],
            FactoryLocation = fields[1],
            EstablishedYear = int.Parse(fields[2]),
            Profit = double.Parse(fields[3], swedishCulture)
        };
    }
}

@onlytiancai
Copy link
Author

多谢,呵呵,我还没用这么高版本的.net,呵呵

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment