如果您对将csv文件读入数组和c读取csv文件存到数组感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解将csv文件读入数组的各种细节,并对c读取csv文件存到数组进行深入的分析,此外还有关于c–
如果您对将csv文件读入数组和c读取csv文件存到数组感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解将csv文件读入数组的各种细节,并对c读取csv文件存到数组进行深入的分析,此外还有关于c – 将大文件读入数组会导致崩溃、C# CSV文件读写、c# – 将文件读入数组时出错、C++ 将 CSV 文件读入向量的实用技巧。
本文目录一览:将csv文件读入数组(c读取csv文件存到数组)
我正在尝试将csv文件“ read_ex.csv”读入数组。我在web /
stackoverflow上进行了无休止的搜索,以找到一种将文件读入数组的方法。我能做的最好的事情是以流方式读取它,但是由于文件大小可变,我无法将其存储在数组中。我相信ArrayList是处理可变大小数组的方法,但是我不知道如何使用它。本质上,我希望能够在while循环结束后访问String数组“
values”。
import java.util.Scanner;import java.io.FileNotFoundException;import java.io.File;public class sortarray { public static void main (String []agrs){ String fileName= "read_ex.csv"; File file= new File(fileName); try{ Scanner inputStream= new Scanner(file); while(inputStream.hasNext()){ String data= inputStream.next(); String[] values = data.split(","); System.out.println(values[1]); } inputStream.close(); }catch (FileNotFoundException e) { e.printStackTrace(); } //This prints out the working directory System.out.println("Present Project Directory : "+ System.getProperty("user.dir")); }}
答案1
小编典典尽管使用@ Minjun.Y提到的Apache CSV库非常好,但我尝试提供一种更接近您的代码并且可能更易于您遵循的解决方案:
import java.io.File;import java.io.FileNotFoundException;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Scanner;public class CsvParser { public static void main(String[] args) { String fileName= "read_ex.csv"; File file= new File(fileName); // this gives you a 2-dimensional array of strings List<List<String>> lines = new ArrayList<>(); Scanner inputStream; try{ inputStream = new Scanner(file); while(inputStream.hasNext()){ String line= inputStream.next(); String[] values = line.split(","); // this adds the currently parsed line to the 2-dimensional string array lines.add(Arrays.asList(values)); } inputStream.close(); }catch (FileNotFoundException e) { e.printStackTrace(); } // the following code lets you iterate through the 2-dimensional array int lineNo = 1; for(List<String> line: lines) { int columnNo = 1; for (String value: line) { System.out.println("Line " + lineNo + " Column " + columnNo + ": " + value); columnNo++; } lineNo++; } }}
让我们逐步进行:
我加了3个进口:
ArrayList
,Arrays
和List
-你会很快对他们有什么好见。它们全部取自java.util
库,该库是每个JDK都提供的标准库。Java中的每个类名称都以大写字母开头(按照惯例-也会以小写字母开头,但是您应该习惯于该惯例)-我在代码中“固定”了这个名称。
我添加了一个二维数组
List<List<String>> lines = new ArrayList<>()
。刚开始时,这可能看起来有些混乱,但这意味着我们创建了一个lines
保存解析结果的变量。该List<String>
语法手段,我们有一个泛型类型List
,有一个类型参数String
-换句话说:字符串列表。整个List<List<String>>
意思是我们有一个字符串列表列表,一个二维字符串数组。随着
lines.add(Arrays.asList(values))
在你的while
循环中,我们可以添加您解析这个二维数组中的行。根据需要Arrays.asList(values)
将String[]
数组转换List
为与我们的List<List<...>>
类型兼容的数组。这使您的线具有可变的长度。我添加的最后几行仅打印了二维数组的内容,应该为您提供有关如何访问此数组中值的一个很好的示例。如果您需要进一步的帮助,请查看foreach循环文档。
将此作为输入文件(read_ex.csv
):
value_1-1,value_1-2,value_1-3,value_1-4value_2-1,value_2-2,value_2-3,value_2-4value_3-1,value_3-2,value_3-3,value_3-4value_4-1,value_4-2,value_4-3,value_4-4value_5-1,value_5-2,value_5-3,value_5-4
该程序将打印以下输出:
Line 1 Column 1: value_1-1Line 1 Column 2: value_1-2Line 1 Column 3: value_1-3Line 1 Column 4: value_1-4Line 2 Column 1: value_2-1Line 2 Column 2: value_2-2Line 2 Column 3: value_2-3Line 2 Column 4: value_2-4Line 3 Column 1: value_3-1Line 3 Column 2: value_3-2Line 3 Column 3: value_3-3Line 3 Column 4: value_3-4Line 4 Column 1: value_4-1Line 4 Column 2: value_4-2Line 4 Column 3: value_4-3Line 4 Column 4: value_4-4Line 5 Column 1: value_5-1Line 5 Column 2: value_5-2Line 5 Column 3: value_5-3Line 5 Column 4: value_5-4
希望这可以帮助 :)
c – 将大文件读入数组会导致崩溃
注意到赋值状态的限制我不能使用任何面向对象的代码,除了cin,cout和文件流对象(这个限制是因为我们还没有进入类,他们不希望我们使用函数而不知道他们是如何工作的).
无论如何,我正在寻找有关程序崩溃原因的见解.我对需要它们的每个变量(包括计数器和函数返回)都使用了很长时间,这应该足够了,因为它们可以达到大约20亿,而且这里不应该有任何超过一百万的数字.
谢谢你的帮助.过去几个小时我一直在这里没有成功.
const long int numberOfDigits = 1000000; int digitsOfPi[numberOfDigits];
解决方法
int digitsOfPi[numberOfDigits];
堆栈没有足够的空间来容纳这么大的阵列.堆栈是存储automatic variables(AKA局部变量)的地方.当执行进入函数时,内存将自动分配给局部变量,并在函数返回时释放.由于这种自动内存管理,堆栈很棒,但一个限制是其大小有限.
大对象应该放在堆上.1堆是一个巨大的内存池,您可以随时根据需要动态分配块.堆和堆栈之间的区别在于您负责分配和释放堆内存.它不会自动为您释放.
要在C中分配堆上的内存,请使用new
运算符,每个新的具有相应的delete
,以便在不再需要时释放内存. (或者在我们的例子中,我们使用new[]
和delete[]
,因为我们正在处理数组.)
// Allocate memory on the heap. int *digitsOfPi = new int[numberOfDigits]; // Use it. // Then free it. delete[] digitsOfPi; // Or better yet,once you're allowed to use the STL... std::vector<int> digitsOfPi;
但是,更大的问题是为什么需要一次将π的所有数字读入内存.更好的设计虽然比较复杂,但只需要固定的O(1)内存量 – 比如一次7位数.
也可以看看
> What and where are the stack and heap?
1您可以探索编译器的选项以增加堆栈大小,但这不是正确的解决方案.
C# CSV文件读写
public class CSVFileHelper
{
/// <summary>
/// 将DataTable中数据写入到CSV文件中
/// </summary>
/// <param name="dt">提供保存数据的DataTable</param>
/// <param name="fileName">CSV的文件路径</param>
public static void SaveCSV(DataTable dt, string fullPath)
{
FileInfo fi = new FileInfo(fullPath);
if (!fi.Directory.Exists)
{
fi.Directory.Create();
}
FileStream fs = new FileStream(fullPath, System.IO.FileMode.Create, System.IO.FileAccess.Write);
//StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default);
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
string data = "";
//写出列名称
for (int i = 0; i < dt.Columns.Count; i++)
{
data += dt.Columns[i].ColumnName.ToString();
if (i < dt.Columns.Count - 1)
{
data += ",";
}
}
sw.WriteLine(data);
//写出各行数据
for (int i = 0; i < dt.Rows.Count; i++)
{
data = "";
for (int j = 0; j < dt.Columns.Count; j++)
{
string str = dt.Rows[i][j].ToString();
str = str.Replace("\"", "\"\"");//替换英文冒号 英文冒号需要换成两个冒号
if (str.Contains('','') || str.Contains(''"'')
|| str.Contains(''\r'') || str.Contains(''\n'')) //含逗号 冒号 换行符的需要放到引号中
{
str = string.Format("\"{0}\"", str);
}
data += str;
if (j < dt.Columns.Count - 1)
{
data += ",";
}
}
sw.WriteLine(data);
}
sw.Close();
fs.Close();
DialogResult result = MessageBox.Show("CSV文件保存成功!");
if (result == DialogResult.OK)
{
System.Diagnostics.Process.Start("explorer.exe", Common.PATH_LANG);
}
}
/// <summary>
/// 将CSV文件的数据读取到DataTable中
/// </summary>
/// <param name="fileName">CSV文件路径</param>
/// <returns>返回读取了CSV数据的DataTable</returns>
public static DataTable OpenCSV(string filePath)
{
Encoding encoding = Common.GetType(filePath); //Encoding.ASCII;//
DataTable dt = new DataTable();
FileStream fs = new FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read);
//StreamReader sr = new StreamReader(fs, Encoding.UTF8);
StreamReader sr = new StreamReader(fs, encoding);
//string fileContent = sr.ReadToEnd();
//encoding = sr.CurrentEncoding;
//记录每次读取的一行记录
string strLine = "";
//记录每行记录中的各字段内容
string[] aryLine = null;
string[] tableHead = null;
//标示列数
int columnCount = 0;
//标示是否是读取的第一行
bool IsFirst = true;
//逐行读取CSV中的数据
while ((strLine = sr.ReadLine()) != null)
{
//strLine = Common.ConvertStringUTF8(strLine, encoding);
//strLine = Common.ConvertStringUTF8(strLine);
if (IsFirst == true)
{
tableHead = strLine.Split('','');
IsFirst = false;
columnCount = tableHead.Length;
//创建列
for (int i = 0; i < columnCount; i++)
{
DataColumn dc = new DataColumn(tableHead[i]);
dt.Columns.Add(dc);
}
}
else
{
aryLine = strLine.Split('','');
DataRow dr = dt.NewRow();
for (int j = 0; j < columnCount; j++)
{
dr[j] = aryLine[j];
}
dt.Rows.Add(dr);
}
}
if (aryLine != null && aryLine.Length > 0)
{
dt.DefaultView.Sort = tableHead[0] + " " + "asc";
}
sr.Close();
fs.Close();
return dt;
}
}
/// 给定文件的路径,读取文件的二进制数据,判断文件的编码类型
/// <param name="FILE_NAME">文件路径</param>
/// <returns>文件的编码类型</returns>
public static System.Text.Encoding GetType(string FILE_NAME)
{
System.IO.FileStream fs = new System.IO.FileStream(FILE_NAME, System.IO.FileMode.Open,
System.IO.FileAccess.Read);
System.Text.Encoding r = GetType(fs);
fs.Close();
return r;
}
/// 通过给定的文件流,判断文件的编码类型
/// <param name="fs">文件流</param>
/// <returns>文件的编码类型</returns>
public static System.Text.Encoding GetType(System.IO.FileStream fs)
{
byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 };
byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 };
byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM
System.Text.Encoding reVal = System.Text.Encoding.Default;
System.IO.BinaryReader r = new System.IO.BinaryReader(fs, System.Text.Encoding.Default);
int i;
int.TryParse(fs.Length.ToString(), out i);
byte[] ss = r.ReadBytes(i);
if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF))
{
reVal = System.Text.Encoding.UTF8;
}
else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00)
{
reVal = System.Text.Encoding.BigEndianUnicode;
}
else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41)
{
reVal = System.Text.Encoding.Unicode;
}
r.Close();
return reVal;
}
/// 判断是否是不带 BOM 的 UTF8 格式
/// <param name="data"></param>
/// <returns></returns>
private static bool IsUTF8Bytes(byte[] data)
{
int charByteCounter = 1; //计算当前正分析的字符应还有的字节数
byte curByte; //当前分析的字节.
for (int i = 0; i < data.Length; i++)
{
curByte = data[i];
if (charByteCounter == 1)
{
if (curByte >= 0x80)
{
//判断当前
while (((curByte <<= 1) & 0x80) != 0)
{
charByteCounter++;
}
//标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X
if (charByteCounter == 1 || charByteCounter > 6)
{
return false;
}
}
}
else
{
//若是UTF-8 此时第一位必须为1
if ((curByte & 0xC0) != 0x80)
{
return false;
}
charByteCounter--;
}
}
if (charByteCounter > 1)
{
throw new Exception("非预期的byte格式");
}
return true;
}
c# – 将文件读入数组时出错
偏移量和长度超出了数组的范围,或者计数大于从索引到源集合末尾的元素数.
这是我的循环
FileStream fs = new FileStream("D:\\06.Total Eclipse Of The Moon.mp3",FileMode.Open); byte[] _FileName = new byte[1024]; long _FileLengh = fs.Length; int position = 0; for (int i = 1024; i < fs.Length; i += 1024) { fs.Read(_FileName,position,Convert.ToInt32(i)); sck.Client.Send(_FileName); Thread.Sleep(30); long unsend = _FileLengh - position; if (unsend < 1024) { position += (int)unsend; } else { position += i; } } fs.Close(); } fs.Length = 5505214
解决方法
fs.Read(_FileName,1024);
那很好(虽然为什么你在int上调用Convert.ToInt32,我不知道.)
在第二次迭代中,您将要打电话
fs.Read(_FileName,2048);
它试图读入从位置开始的_FileName字节数组(非零)并获取最多2048个字节.字节数组只有1024个字节长,因此无法工作.
其他问题:
>您尚未使用using语句,因此在例外情况下,您将使流保持打开状态
>您忽略了Read的返回值,这意味着您不知道实际读取了多少缓冲区
>无论读取了多少,您都无条件地向套接字发送完整的缓冲区.
您的代码应该看起来更像这样:
using (FileStream fs = File.OpenRead("D:\\06.Total Eclipse Of The Moon.mp3")) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = fs.Read(buffer,buffer.Length)) > 0) { sck.Client.Send(buffer,bytesRead); // Do you really need this? Thread.Sleep(30); } }
C++ 将 CSV 文件读入向量
如何解决C++ 将 CSV 文件读入向量?
我正在尝试读取如下所示的 .csv 文件:
Name,N1,N2,N3,N4,...
A,2,1,50,5,...
B,-90,7,...
C,3,0.4,9,...
...
其中列超过 500 列。
我想把每一行读成一对向量,包括:
1- 姓名
2- 包含其余列的向量 (N1..Nn)
它看起来像这样 vector<pair<string,vector<double>>>
,但我不确定如何将数据读入这种格式。
谢谢
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
我们今天的关于将csv文件读入数组和c读取csv文件存到数组的分享已经告一段落,感谢您的关注,如果您想了解更多关于c – 将大文件读入数组会导致崩溃、C# CSV文件读写、c# – 将文件读入数组时出错、C++ 将 CSV 文件读入向量的相关信息,请在本站查询。
本文标签: