gpt4 book ai didi

c# - 使用定界符拆分,除非定界符被转义

转载 作者:太空狗 更新时间:2023-10-29 21:36:33 25 4
gpt4 key购买 nike

我正在使用

读取来自 excel 的剪贴板数据

var stream = (System.IO.Stream) (Forms.Clipboard.GetDataObject()).GetData(Forms.DataFormats.CommaSeparatedValue);,

但不幸的是,excel 传递的是单元格文本而不是单元格值。当单元格使用特殊格式(例如千位分隔符)时,列中一系列单元格的剪贴板数据如下所示:

 1,234,123.00    2,345.00    342.00      12,345.00

存储为:

\" 1,234,123.00 \",\" 2,345.00 \", 342.00 ,\" 12,345.00 \"

当我真正想要的是:

 1234123.00, 2345.00, 342.00, 12345.00

我之前一直在使用 clipData.Split(new string[] { ","}, StringSllitOptions.None)) 函数将我的 CSV 剪贴板数据转换为一系列单元格,但是这个当存在包含逗号的转义格式化文本时失败。


我想问是否有人能想出一种方法将这个字符串拆分成一组单元格,忽略 \" 位中转义的逗号,因为这是 Excel 选择转义的方式包含逗号的单元格。

简而言之,我怎样才能转换包含这个的单个字符串:

\" 1,234,123.00 \",\" 2,345.00 \", 342.00 ,\" 12,345.00 \"

放入包含以下内容的字符串数组:

{ "1,234,123.00", "2,345.00", "342.00", "12,345.00" }

不会破坏我解析简单逗号分隔字符串的能力。

*****编辑***

在此处跟进问题(制定为 DFA):Split a string based on each time a Deterministic Finite Automata reaches a final state?

最佳答案

首先,我之前处理过来自 Excel 的数据,您通常看到的是逗号分隔值,如果该值被认为是一个字符串,它将在它周围有双引号(并且可以包含逗号和双引号)。如果它被认为是数字,则没有双引号。此外,如果数据包含将由双引号分隔的双引号,如 ""。所以假设所有这些都是我过去处理这个问题的方式

public static IEnumerable<string> SplitExcelRow(this string value)
{
value = value.Replace("\"\"", "&quot;");
bool quoted = false;
int currStartIndex = 0;
for (int i = 0; i < value.Length; i++)
{
char currChar = value[i];
if (currChar == '"')
{
quoted = !quoted;
}
else if (currChar == ',')
{
if (!quoted)
{
yield return value.Substring(currStartIndex, i - currStartIndex)
.Trim()
.Replace("\"","")
.Replace("&quot;","\"");
currStartIndex = i + 1;
}
}
}
yield return value.Substring(currStartIndex, value.Length - currStartIndex)
.Trim()
.Replace("\"", "")
.Replace("&quot;", "\"");
}

当然,这是假设传入的数据是有效的,所以如果你有类似 "fo,o"b,ar","bar""foo" 的东西,这将不起作用。此外,如果你data 包含 " 然后它会变成一个 "这可能是可取的,也可能不是可取的。

关于c# - 使用定界符拆分,除非定界符被转义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4403194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com