我有一个JS数组,它使用StreamWriter写入服务器上的文本文件。这就行:
sw.WriteLine(Request.Form["seatsArray"]);
此时正在写出一行,其中包含数组的全部内容。我想在每5个逗号之后写一个新行。示例数组:
BN,ST,A1,303,601,BN,ST,A2,303,621,BN,WC,A3,303,641,
应输出:
BN,ST,A1,303,601,
BN,ST,A2,303,621,
BN,WC,A3,303,641,
我知道我可以使用字符串替换,但我只知道如何在每个逗号之后使这个输出成为新行,而不是在指定数量的逗号之后。
我怎样才能实现这一目标?
谢谢!
答案 0 :(得分:2)
嗯,这是我能想到的最简单的答案:
string[] bits = Request.Form["seatsArray"].Split(',');
for (int i = 0; i < bits.Length; i++)
{
sw.Write(bits[i]);
sw.Write(",");
if (i % 5 == 4)
{
sw.WriteLine();
}
}
它不是非常优雅,但我相信它会完成工作。
如有必要,您可能希望此后完成当前行:
if (bits[i].Length % 5 != 0)
{
sw.WriteLine();
}
我确信有更聪明的方法......但这很简单。
一个问题:值总是三个字符长吗?因为如果是这样,你基本上只是每20个字符就打破一次......
答案 1 :(得分:0)
类似的东西:
var input = "BN,ST,A1,303,601,BN,ST,A2,303,621,BN,WC,A3,303,641,";
var splitted = input.Split(',');
var cols = 5;
var rows = splitted.Length / cols;
var arr = new string[rows, cols];
for (int row = 0; row < rows; row++)
for (int col = 0; col < cols; col++)
arr[row, col] = splitted[row * cols + col];
我会尝试找到更优雅的解决方案。适当地使用一些功能风格。
更新:只是发现它实际上并不是您需要的。通过这个,您将得到一个包含3行和5列的2D数组。
然而,这将给你3行。他们没有结尾','。你想要那个吗?你一直想把它打印出来吗?或者您想访问不同的行?:
var splitted = input.Split(new [] { ','}, StringSplitOptions.RemoveEmptyEntries);
var lines = from item in splitted.Select((part, i) => new { part, i })
group item by item.i / 5 into g
select string.Join(",", g.Select(a => a.part));
或者通过这个相当大的代码。但我经常需要一种“块”方法,因此它可以重复使用。我不知道是否有内置的“Chunk”方法 - 找不到它。
public static class LinqExtensions
{
public static IEnumerable<IList<T>> Chunks<T>(this IEnumerable<T> xs, int size)
{
int i = 0;
var curr = new List<T>();
foreach (var x in xs)
{
curr.Add(x);
if (++i % size == 0)
{
yield return curr;
curr = new List<T>();
}
}
}
}
用法:
var lines = input.Split(',').Chunks(5).Select(list => string.Join(",", list));