将一个数组拆分为多个数组
本文关键字:数组 拆分 一个 | 更新日期: 2023-09-27 18:13:06
我有一个文本文件,内容如下:
01 Dir1
abcd
efg
hij
klm
nop
qrs
tuv
wxy
zab
yxw
vut
dcb
02 Dir2
abcd
efg
hij
klm
nop
qrs
tuv
wxy
zab
yxw
vut
dcb
我得到一个数组,它是通过读取文件创建的:
string[] lines = File.ReadAllLines(path);
这给了我一个包含所有条目(包括空条目)的数组。
文本文件背后的思想是有一个文件夹和该文件夹下的文件。因此,"01 Dir1"是一个文件夹,它之后的每一行直到空行都是一个文件。
我正在尝试的是有一个数组列表,因此从上面的示例中,列表中将有两个数组,一个从"01 Dir1"开始直到空条目,下一个从"02 Dir2"开始直到结束。
我可以遍历初始数组并为每个单独的目录创建列表,但有其他方法吗?
这种方法的问题是,它最终会在内存中的不同集合中拥有相同的数据,一个来自ReadAllLines数组,另一个来自它的子数组。
您想要像下面这样的东西吗?
这将逐行读取,您可以决定如何处理它。所以你不会得到一个包含所有条目的大字符串数组。这里的结果将是一个包含字符串数组并跳过空行的列表。
//This will be the resulting list of arrays
var fileArrayList = new List<string[]>();
var filereader = new System.IO.StreamReader("yourfile");
var tmpArr = new List<string>();
var line = "";
while((line = filereader.ReadLine()) != null)
{
if(String.IsNullOrEmpty(line){
//put this array to our list
fileArrayList.Add(tmpArr.ToArray());
//clean the temp one
tmpArr.Clear();
}else
{
tmpArr.Add(line);
}
}
//add the last entry
fileArrayList.Add(tmpArr.ToArray());
tmpArr = null;
//close the stream
filereader.Close();
这样你就可以有一个包含目录名作为键的Dictionary
和包含文件名作为值的List<string>
。
我没有处理异常情况
Dictionary<string, List<string>> data = new Dictionary<string,List<string>>();
using (StreamReader reader = File.OpenText(filename))
{
while (!reader.EndOfStream)
{
string dirName = reader.ReadLine();
List<string> currentFiles = new List<string>();
data.Add(dirName, currentFiles);
string fileName;
while (!reader.EndOfStream && (fileName = reader.ReadLine()).Trim() != "")
{
currentFiles.Add(fileName);
}
}
}
list<string> listBeforeEmpty = new list<string>();
list<string> listAfterEmpty = new list<string>();
//Indicates whether the loop is before the empty line or not
bool isEmptyLineFound = false;
for (int i = 0; i < lines.Length; i++)
{
//If the empty line was found
if (lines[i].CompareTo(@"") == 0)
{
isEmptyLineFound = true;
}
//Add the line to the right list
if (isEmptyLineFound == false)
listBeforeEmpty .Add(lines[i]);
else listAfterEmpty .Add(lines[i]);
}
我决定尝试一下。这是我想到的,它应该工作:
private static string[] _arr = new string[] // The stuff you read from file.
private static List<string[]> _arrays = new List<string[]>();
while (_arr.Length > 0)
{
var a = _arr.TakeWhile(s =>
{
var li = _arr.ToList();
return
s != string.Empty // Take it if the string isn't empty.
|| (s == string.Empty && li.IndexOf(s) == 0) // Or if it's empty, but it's the first element in the array (it's the next one after we've just finished a batch)
|| li.IndexOf(s) == _arr.Length; // And take it if it's the last element (in the case of an empty string as the last element)
}).ToArray();
_arrays.Add(a);
// Re-create the array to only include the stuff we haven't solved yet.
var l = _arr.ToList();
l.RemoveRange(0, a.Length);
_arr = l.ToArray();
}
它有点粗糙,可以改进,但它应该是你可以使用的。
另一方面,您可能应该使用另一种读取文件的方法,并在读取文件时确定这些单独的数组。