Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将制表符分隔值从剪贴板复制到datagridview_C# - Fatal编程技术网

C# 将制表符分隔值从剪贴板复制到datagridview

C# 将制表符分隔值从剪贴板复制到datagridview,c#,C#,当我从应用程序复制剪贴板中的原始数据时,它看起来像这样 Trade Info NE62 -- NE62 Symbol Side Quantity Avg Price ClientAcct ESU8 BUY 100 2809.2500 35199008 FLT.V SELL 15,000 1.7040 tB324aV

当我从应用程序复制剪贴板中的原始数据时,它看起来像这样

Trade Info

NE62 -- NE62

Symbol      Side        Quantity        Avg Price       ClientAcct      

ESU8        BUY     100     2809.2500       35199008        
FLT.V       SELL        15,000      1.7040      tB324aV     
TRST.TO     SELL        4,850       7.1500      tB324aVV        
YGR.TO      SELL        5,200       5.3806      tB324aV 


我使用regex删除了最上面一行(Trade Info NE62--NE62),因为它对于每个用户都是可变的

然后,我使用以下字符串动态分配列。每个用户都有一个可变的列长度,这取决于他们需要的信息

string columnarray = s.Substring(0, s.LastIndexOf("\t\t\r\n\r\n"));


剩下的字符串存储在另一个变量中,该变量将填充在datatable中,这正是我很难理解的。下面是我需要填入数据表的剩余值

首选的解决方案是循环遍历字符串,每次点击时将其拆分\t\t并将其放在同一行中,点击后跳转到下一行。\r\n

ESU8\t\tBUY\t\t100\t\t2809.2500\t\tB324aV\t\t\r\nFLT.V\t\tSELL\t\t15,000\t\t1.7040\t\tB324aV\t\t\r\nTRST.TO\t\tSELL\t\t4,850\t\t7.1500\t\tB324aV\t\t\r\nYGR.TO\t\tSELL\t\t5,200\t\t5.3806\t\tB324aV\t

理想的结果应该是这样的

Ticker | Action | Quantity | Price     | Acc Number
---------------------------------------------------
ESU8   | BUY    | 100      | 2809.2500 | 900000 
FLT.V  | SELL   | 15,000   | 1.7040    | B324aV 
TRT.TO | SELL   | 4,850    | 7.1500    | f23AAA 
YGR.TO | SELL   | 5,200    | 5.3806    | 42ABBB

如果我正确理解了这个问题,下面的代码应该可以完成这项工作:

public Form1()
{
    InitializeComponent();
    dataGridView1.DataSource = CreateTable();
}

private DataTable CreateTable()
{
    var str = "ESU8\t\tBUY\t\t100\t\t2809.2500\t\tB324aV\t\t\r\nFLT.V\t\tSELL\t\t15,000\t\t1.7040\t\tB324aV\t\t\r\nTRST.TO\t\tSELL\t\t4,850\t\t7.1500\t\tB324aV\t\t\r\nYGR.TO\t\tSELL\t\t5,200\t\t5.3806\t\tB324aV\t";

    DataTable dt = new DataTable();

    dt.Columns.Add("Ticker", typeof(string));
    dt.Columns.Add("Action", typeof(string));
    dt.Columns.Add("Quantity", typeof(double));
    dt.Columns.Add("Price", typeof(double));
    dt.Columns.Add("Acc Number", typeof(string));

    str = str.Replace("\t\t", " ");
    str = str.Replace(",", ".");
    str = str.Replace("\r\n", "");

    var r = str.Split();

    int rows = r.Length / 5;
    for (int i = 0; i < rows; i++)
    { 
        dt.Rows.Add(
            r[i * 5 + 0], 
            r[i * 5 + 1],                                  
            double.Parse(r[i * 5 + 2]),
            double.Parse(r[i * 5 + 3]),
            r[i * 5 + 4]);
    }

    return dt;
}
public Form1()
{
初始化组件();
dataGridView1.DataSource=CreateTable();
}
私有数据表CreateTable()
{
var str=“ESU8\t\tBUY\t\t100\t\t2809.2500\t\tB324aV\t\t\r\nFLT.V\t\tSELL\t\t15000\t\t1.7040\t\tB324aV\t\t\r\nTRST.TO\t\tSELL\t\t4850\t\t7.1500\t\tB324aV\t\t\t\t\t\r\nYGR.TO\t\tSELL\t\t\t\t52200\t\t5.3806\t\tbav\t”;
DataTable dt=新的DataTable();
dt.Columns.Add(“Ticker”,typeof(string));
添加(“动作”,类型(字符串));
dt.列。添加(“数量”,类型(双);
dt.列。添加(“价格”,类型(双);
添加(“Acc编号”,类型(字符串));
str=str.Replace(“\t\t”,”);
str=str.Replace(“,”,“);
str=str.Replace(“\r\n”,”);
var r=str.Split();
int rows=r.长度/5;
对于(int i=0;i
输出:


如果我正确理解了问题,下面的代码应该可以完成这项工作:

public Form1()
{
    InitializeComponent();
    dataGridView1.DataSource = CreateTable();
}

private DataTable CreateTable()
{
    var str = "ESU8\t\tBUY\t\t100\t\t2809.2500\t\tB324aV\t\t\r\nFLT.V\t\tSELL\t\t15,000\t\t1.7040\t\tB324aV\t\t\r\nTRST.TO\t\tSELL\t\t4,850\t\t7.1500\t\tB324aV\t\t\r\nYGR.TO\t\tSELL\t\t5,200\t\t5.3806\t\tB324aV\t";

    DataTable dt = new DataTable();

    dt.Columns.Add("Ticker", typeof(string));
    dt.Columns.Add("Action", typeof(string));
    dt.Columns.Add("Quantity", typeof(double));
    dt.Columns.Add("Price", typeof(double));
    dt.Columns.Add("Acc Number", typeof(string));

    str = str.Replace("\t\t", " ");
    str = str.Replace(",", ".");
    str = str.Replace("\r\n", "");

    var r = str.Split();

    int rows = r.Length / 5;
    for (int i = 0; i < rows; i++)
    { 
        dt.Rows.Add(
            r[i * 5 + 0], 
            r[i * 5 + 1],                                  
            double.Parse(r[i * 5 + 2]),
            double.Parse(r[i * 5 + 3]),
            r[i * 5 + 4]);
    }

    return dt;
}
public Form1()
{
初始化组件();
dataGridView1.DataSource=CreateTable();
}
私有数据表CreateTable()
{
var str=“ESU8\t\tBUY\t\t100\t\t2809.2500\t\tB324aV\t\t\r\nFLT.V\t\tSELL\t\t15000\t\t1.7040\t\tB324aV\t\t\r\nTRST.TO\t\tSELL\t\t4850\t\t7.1500\t\tB324aV\t\t\t\t\t\r\nYGR.TO\t\tSELL\t\t\t\t52200\t\t5.3806\t\tbav\t”;
DataTable dt=新的DataTable();
dt.Columns.Add(“Ticker”,typeof(string));
添加(“动作”,类型(字符串));
dt.列。添加(“数量”,类型(双);
dt.列。添加(“价格”,类型(双);
添加(“Acc编号”,类型(字符串));
str=str.Replace(“\t\t”,”);
str=str.Replace(“,”,“);
str=str.Replace(“\r\n”,”);
var r=str.Split();
int rows=r.长度/5;
对于(int i=0;i
输出:


所以我设计了一个似乎效果很好的解决方案。我使用解析器解析字符串,并在格式化字符串后将其添加到dataTable中,以使其便于解析。把它贴在这里,以防将来有人需要帮助

string[] ColArray = Regex.Split(columnarray, "\t\t");
string[] DatArray = Regex.Split(dataArray, "\t\t");
DatArray = DatArray.Where(x => !string.IsNullOrEmpty(x)).ToArray();

//Join all the split string using (+)
string datstring = string.Join("+", DatArray);

//Remove the additional (+) symbol infront of the \r\n\ to match array length        
datstring = Regex.Replace(datstring, @"[+\\r\\]\B", "");
DataTable d = new DataTable();

foreach (string b in ColArray{
    d.Columns.Add(b);                
    }
// use a parser to parse through the string and add the items to your datatable
using (var reader = new StringReader(datstring))
    {
        TextFieldParser parser = new TextFieldParser(reader)
        { HasFieldsEnclosedInQuotes = false, Delimiters = new string[] { "+" } };
        while(!parser.EndOfData)
        {
            var drow = d.NewRow();
            drow.ItemArray = parser.ReadFields();
            d.Rows.Add(drow);
        }
     }
DGV.Datasource = d;

所以我设计了一个似乎很有效的解决方案。我使用解析器解析字符串,并在格式化字符串后将其添加到dataTable中,以使其便于解析。把它贴在这里,以防将来有人需要帮助

string[] ColArray = Regex.Split(columnarray, "\t\t");
string[] DatArray = Regex.Split(dataArray, "\t\t");
DatArray = DatArray.Where(x => !string.IsNullOrEmpty(x)).ToArray();

//Join all the split string using (+)
string datstring = string.Join("+", DatArray);

//Remove the additional (+) symbol infront of the \r\n\ to match array length        
datstring = Regex.Replace(datstring, @"[+\\r\\]\B", "");
DataTable d = new DataTable();

foreach (string b in ColArray{
    d.Columns.Add(b);                
    }
// use a parser to parse through the string and add the items to your datatable
using (var reader = new StringReader(datstring))
    {
        TextFieldParser parser = new TextFieldParser(reader)
        { HasFieldsEnclosedInQuotes = false, Delimiters = new string[] { "+" } };
        while(!parser.EndOfData)
        {
            var drow = d.NewRow();
            drow.ItemArray = parser.ReadFields();
            d.Rows.Add(drow);
        }
     }
DGV.Datasource = d;

我跟不上。是您没有在上拆分的问题,所以您将所有数据都放在一个大行中?@Evan Hi Evan我更新了问题,希望现在对您有所帮助。是的,我在计算如何通过拆分\t\t填充同一行中的所有列时遇到了问题,并在点击后跳转到下一列\r\n我在跟随时遇到了问题。是您没有在上拆分的问题,所以您将所有数据都放在一个大行中?@Evan Hi Evan我更新了问题,希望现在对您有所帮助。是的,我在计算如何填充同一行中的所有列时遇到了问题,方法是拆分\t\t并在点击后跳转到下一列\r\n我更新了一点问题。这似乎可行,但它违背了基于剪贴板中第一行数据动态分配列的目的,因为每个用户都有一个可变的列号@L_JHi我稍微更新了这个问题。这似乎可行,但它违背了基于剪贴板中第一行数据动态分配列的目的,因为每个用户都有一个可变的列号@L_JHi,这使得表非常硬编码。因为每个用户都有不同的列和行,这取决于他们在endHi上如何格式化他们的表,这使得表非常硬编码。因为每个用户都有不同的列和行,这取决于他们端部表格的格式
Ticker | Action | Quantity | Price     | Acc Number
---------------------------------------------------
ESU8   | BUY    | 100      | 2809.2500 | 900000 
FLT.V  | SELL   | 15,000   | 1.7040    | B324aV 
TRT.TO | SELL   | 4,850    | 7.1500    | f23AAA 
YGR.TO | SELL   | 5,200    | 5.3806    | 42ABBB
public Form1()
{
    InitializeComponent();
    dataGridView1.DataSource = CreateTable();
}

private DataTable CreateTable()
{
    var str = "ESU8\t\tBUY\t\t100\t\t2809.2500\t\tB324aV\t\t\r\nFLT.V\t\tSELL\t\t15,000\t\t1.7040\t\tB324aV\t\t\r\nTRST.TO\t\tSELL\t\t4,850\t\t7.1500\t\tB324aV\t\t\r\nYGR.TO\t\tSELL\t\t5,200\t\t5.3806\t\tB324aV\t";

    DataTable dt = new DataTable();

    dt.Columns.Add("Ticker", typeof(string));
    dt.Columns.Add("Action", typeof(string));
    dt.Columns.Add("Quantity", typeof(double));
    dt.Columns.Add("Price", typeof(double));
    dt.Columns.Add("Acc Number", typeof(string));

    str = str.Replace("\t\t", " ");
    str = str.Replace(",", ".");
    str = str.Replace("\r\n", "");

    var r = str.Split();

    int rows = r.Length / 5;
    for (int i = 0; i < rows; i++)
    { 
        dt.Rows.Add(
            r[i * 5 + 0], 
            r[i * 5 + 1],                                  
            double.Parse(r[i * 5 + 2]),
            double.Parse(r[i * 5 + 3]),
            r[i * 5 + 4]);
    }

    return dt;
}
string s = @"Trade Info

NE62 -- NE62

Symbol      Side        Quantity        Avg Price       ClientAcct      

ESU8        BUY     100     2809.2500       35199008        
FLT.V       SELL        15,000      1.7040      tB324aV     
TRST.TO     SELL        4,850       7.1500      tB324aVV        
YGR.TO      SELL        5,200       5.3806      tB324aV";

var data = s.Split(new char[] { '\r','\n'},StringSplitOptions.RemoveEmptyEntries)
.SkipWhile(x => !x.StartsWith("Symbol"))
.Skip(1)
.Select(line => line.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries))
.Select(d => new {
    Symbol = d[0],
    Side = d[1],
    Quantity = int.Parse(d[2].Replace(",","")),
    AvgPrice = decimal.Parse(d[3]),
    ClientAcct = d[4]
});

yourDataGridView.DataSource = data.ToList();
string[] ColArray = Regex.Split(columnarray, "\t\t");
string[] DatArray = Regex.Split(dataArray, "\t\t");
DatArray = DatArray.Where(x => !string.IsNullOrEmpty(x)).ToArray();

//Join all the split string using (+)
string datstring = string.Join("+", DatArray);

//Remove the additional (+) symbol infront of the \r\n\ to match array length        
datstring = Regex.Replace(datstring, @"[+\\r\\]\B", "");
DataTable d = new DataTable();

foreach (string b in ColArray{
    d.Columns.Add(b);                
    }
// use a parser to parse through the string and add the items to your datatable
using (var reader = new StringReader(datstring))
    {
        TextFieldParser parser = new TextFieldParser(reader)
        { HasFieldsEnclosedInQuotes = false, Delimiters = new string[] { "+" } };
        while(!parser.EndOfData)
        {
            var drow = d.NewRow();
            drow.ItemArray = parser.ReadFields();
            d.Rows.Add(drow);
        }
     }
DGV.Datasource = d;